Pular para o conteúdo principal

Estágio lento do Spark com pouca E/S

Se um estágio é executado lentamente, mas lê, grava e reorganiza poucos dados, a query em si geralmente é o gargalo.

Use esta página depois de descartar skew and spill e high I/O no estágio mais longo. Se o estágio tiver apenas uma tarefa, consulte Long Spark stage with one task.

Um estágio lento com pouca E/S pode ter estas causas:

Use o DAG SQL para identificar quase todos esses problemas.

Abra o SQL DAG​

Para abrir o DAG SQL, role até o topo da página do job e clique em Query SQL Associada :

ID DO SQL

O DAG aparece. Se não aparecer, role para encontrá-lo:

SQL DAG

Estude o DAG para identificar onde o tempo está sendo gasto. Alguns nós mostram sua duração diretamente. Por exemplo, este nó mostra uma duração de 2,1 minutos e inclui o ID do estágio:

Nodo de estágio lento

Os outros nós só mostram sua duração depois que você clica neles. Neste exemplo, a duração do nó de gravação é de 1,4 minutos:

Nodo de gravação lenta

Esses tempos são cumulativos e representam a soma do tempo do executor em todas as tarefas, não o tempo real decorrido. Eles se correlacionam com o tempo decorrido e o custo.

Clique em um operador para ver métricas como linhas de saída, pico de memória e tamanho de spill. Para obter definições das métricas de operador que o Spark relata, consulte Métricas SQL na documentação da interface da Web do Apache Spark.

Lendo muitos arquivos pequenos​

Se um operador de varredura consumir a maior parte do tempo, clique nele e confira o número de arquivos lidos:

Lendo muitos arquivos

Se a query ler dezenas de milhares de arquivos ou mais, a tabela pode ter um problema de arquivos pequenos. Os arquivos devem ter pelo menos 8 MB. O particionamento em muitas colunas ou em uma coluna de alta cardinalidade é a causa mais comum de arquivos pequenos.

Executar OPTIMIZE pode ajudar. O Databricks também recomenda habilitar a otimização preditiva e reconsiderar a disposição do arquivo.

Escrevendo muitos arquivos pequenos​

Se um operador de gravação consumir a maior parte do tempo, clique nele e verifique o número de arquivos e dados gravados:

Escrevendo muitos arquivos

Se a query gravar dezenas de milhares de arquivos ou mais, a tabela poderá ter um problema com arquivos pequenos. Os arquivos devem ter pelo menos 8 MB. O particionamento em muitas colunas ou em uma coluna de alta cardinalidade geralmente causa arquivos pequenos. Habilite a otimização preditiva, considere a disposição do arquivo ou ative as gravações otimizadas.

UDFs lentos​

Se a query contiver UDFs ou um nó DAG como este, UDFs podem ser o gargalo:

Nó UDF

Para verificar, comente o UDF e observe a velocidade do pipeline. Se o UDF for o gargalo, reescreva-o usando funções nativas sempre que possível. Se você não puder reescrevê-lo, verifique o número de tarefas que executam a execução do UDF. Se o estágio tiver menos tarefas do que o cluster tem núcleos, repartition() o DataFrame antes de aplicar o UDF:

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

As UDFs também podem causar problemas de memória. Cada tarefa pode carregar todos os dados da sua partição na memória. Se esses dados forem muito grandes, a query pode ficar lenta ou instável. Repartitioning também ajuda aqui porque torna cada tarefa menor.

Cartesiano join​

Joins cartesianos e joins de loop aninhados são muito caros. Se um deles aparecer no DAG, verifique se é intencional e considere alternativas. Se a condição de join for um ponto em um intervalo ou uma condição de sobreposição de intervalos, consulte Otimização da união de intervalos.

Exploding join ou explode​

Se um nó de DAG exibir um pequeno número de linhas de entrada e muito mais linhas de saída, um join de expansão ou explode() pode ser a causa:

Junção explosiva

Para corrigir uma explode join, determine qual subconjunto de resultados você precisa e, em seguida, atualize a condição de join ou reduza o número de linhas de entrada de ambas as relações. Veja EXPLODING_JOIN.