Partilhar via


Estágio Slow Spark com pouca entrada/saída

Se você tem um estágio lento com pouca E/S, isso pode ser causado por:

  • Ler muitos ficheiros pequenos
  • Escrever muitos ficheiros pequenos
  • UDF(s) lento(s)
  • Junção cartesiana
  • Junção explosiva

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

Abra o SQL DAG

Para abrir o SQL DAG, deslize até à parte superior da página da tarefa e clique em Consulta SQL Associada:

ID SQL

Agora deverás ver o DAG. Se não, role um pouco e você deve vê-lo:

SLQ DAG

Antes de seguir em frente, familiarize-se com o DAG e onde o tempo está sendo gasto. Alguns nós no DAG contêm informações temporais úteis e outros não. Por exemplo, este bloco demorou 2,1 minutos e até fornece o ID da etapa:

nó de estágio lento

Este nó requer que você o abra para ver que levou 1,4 minutos:

Nó de Gravação Lenta

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

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

Ler muitos ficheiros pequenos

Se vir que um dos seus operadores de análise está a demorar muito tempo, abra-o e procure o número de ficheiros que lê:

Lendo muitos arquivos

Se você estiver lendo dezenas de milhares de arquivos ou mais, você pode ter um pequeno problema de arquivo. Os seus ficheiros não devem ter menos de 8MB. O problema do arquivo pequeno é mais frequentemente causado pelo particionamento em muitas colunas ou uma coluna de alta cardinalidade.

Se tiveres sorte, podes apenas precisar de executar OPTIMIZE. Independentemente disso, você precisa reconsiderar seu layout de arquivo .

Escrever muitos ficheiros pequenos

Se vir que a sua escrita está a demorar muito tempo, abra-a e procure o número de ficheiros e a quantidade de dados que foram gravados:

Escrever muitos ficheiros

Se estiver a escrever dezenas de milhares de ficheiros ou mais, poderá ter um pequeno problema com ficheiros. Os seus ficheiros não devem ter menos de 8MB. O problema do arquivo pequeno é mais frequentemente causado pelo particionamento em muitas colunas ou uma coluna de alta cardinalidade. Você precisa reconsiderar seu layout de arquivo ou ativar gravações otimizadas.

UDFs lentas

Se sabes que tens UDFs, ou vês algo assim no teu DAG, poderás estar a sofrer de UDFs lentos:

Nó UDF

Se você acha que está sofrendo com esse problema, tente comentar seu UDF para ver como ele afeta a velocidade do seu pipeline. Se o UDF é de facto onde o tempo está a ser gasto, a sua melhor opção é reescrever o UDF usando funções nativas. Se isso não for possível, considere o número de tarefas no estágio que executa o seu UDF. Se for menor que o número de núcleos no cluster, repartition() o dataframe antes de usar o UDF:

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

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

Junção cartesiana

Se vires uma ligação cartesiana ou uma ligação de loop aninhada no teu DAG, deves saber que estas ligações são muito caras. Certifique-se de que é isso que você pretendia e veja se há outra maneira.

Junção por Explosão ou Explosão

Se você vir algumas linhas entrando em um nó e magnitudes mais saindo, você pode estar sofrendo de uma junção explodindo ou explodindo():

Junção Explosiva

Leia mais sobre explosões no guia de otimização do Databricks.