Compartilhar via


Estágio lento do Spark com pouca E/S

Se você tiver um estágio lento sem muita E/S, isso poderá ser causado por:

  • Ler muitos arquivos pequenos
  • Gravar muitos arquivos pequenos
  • UDF(s) lenta(s)
  • Ingresso cartesiano
  • Ingresso em explosão

Quase todos esses problemas podem ser identificados usando o DAG do SQL.

Abrir o DAG do SQL

Para abrir o DAG do SQL, role até a parte superior da página do trabalho e clique em Consulta SQL Associada:

ID da SQL

Você já deve ver o DAG. Caso contrário, role um pouco e você deverá vê-lo:

DAG do SLQ

Antes de prosseguir, familiarize-se com o DAG e onde o tempo está sendo gasto. Alguns nós no DAG têm informações de tempo úteis e outros não. Por exemplo, esse bloco levou 2,1 minutos e ainda fornece a ID do estágio:

Nó de Estágio Lento

Esse nó requer que você o abra para ver que demorou 1,4 minutos:

Nó de Gravação Lenta

Esses tempos são cumulativos, portanto, é o tempo total gasto em todas as tarefas, não no horário do relógio. Mas ainda é muito útil, pois eles estão correlacionados com o tempo e o custo do relógio.

É útil se familiarizar com onde o tempo está sendo gasto no DAG.

Ler muitos arquivos pequenos

Se você vir que um dos seus operadores de verificação está demorando muito, abra-o e procure o número de arquivos lidos:

Lendo Muitos Arquivos

Se você estiver lendo dezenas de milhares de arquivos ou mais, poderá ter um pequeno problema de arquivo. Seus arquivos não devem ter menos de 8 MB. Geralmente, o pequeno problema do arquivo é causado pelo particionamento em muitas colunas ou em uma coluna de alta cardinalidade.

Se tiver sorte, talvez você precise executar apenas OPTIMIZE. Independentemente disso, você precisa reconsiderar seu layout do arquivo.

Gravar muitos arquivos pequenos

Se você vir que sua gravação está demorando muito, abra-a e procure o número de arquivos e a quantidade de dados gravados:

Gravando Muitos Arquivos

Se você estiver gravando dezenas de milhares de arquivos ou mais, poderá ter um pequeno problema de arquivo. Seus arquivos não devem ter menos de 8 MB. Geralmente, o pequeno problema do arquivo é causado pelo particionamento em muitas colunas ou em uma coluna de alta cardinalidade. Você precisa reconsiderar seu layout do arquivo ou ativar gravações otimizadas.

UDFs lentas

Se você souber que você tem UDFs, ou ver algo assim no seu DAG, poderá estar sofrendo de UDFs lentas:

Nó da UDF

Se você acha que está sofrendo com esse problema, tente comentar sua UDF para ver como ela afeta a velocidade do seu pipeline. Se a UDF for realmente onde o tempo está sendo gasto, sua melhor aposta é regravar a UDF usando funções nativas. Se isso não for possível, considere o número de tarefas na fase de execução da sua UDF. Se for menor que o número de núcleos no cluster, repartition() seu dataframe antes de usar a UDF:

  (df
    .repartition(num_cores)
    .withColumn('new_col', udf(...))
  )

As UDFs também podem sofrer de problemas de memória. Considere que cada tarefa pode ter que carregar todos os dados na sua partição na memória. Se esses dados forem muito grandes, as coisas poderão ficar muito lentas ou instáveis. A repartição também pode resolver esse problema, tornando cada tarefa menor.

Ingresso cartesiano

Se você vir uma junção cartesiana ou uma junção de loop aninhado na sua DAG, você deve saber que essas junções são muito caras. Verifique se é isso que você pretendia e veja se há outra maneira.

Ingresso explosivo ou explosão

Se você vir poucas linhas entrando em um nó e muitas outras saindo, pode estar sofrendo de um ingresso explosivo ou explosão

Ingresso Explosivo

Leia mais sobre explosões na Guia de Otimização do Databricks.