Pular para o conteúdo principal

Estágio Spark longo com uma tarefa

Um estágio de longa execução com apenas uma tarefa não tem paralelismo. Enquanto a tarefa está em execução, uma CPU faz o trabalho e o restante do cluster pode estar parado. Adicionar workers não ajuda, porque o Spark não pode distribuir o trabalho entre eles.

Use esta página quando o estágio mais longo tiver exatamente uma tarefa. Se o estágio tiver muitas tarefas, verifique-o em relação a desequilíbrio de dados (skew) e spill. Veja Desequilíbrio de dados (skew) e spill.

Causas e correções comuns​

Um estágio de tarefa única geralmente tem uma destas causas. Encontre aquela que corresponde ao seu código e, em seguida, aplique a correção:

  • Uma UDF cara em dados pequenos. Pequenas entradas podem terminar em uma única partição, então uma tarefa executa toda a UDF. Reescreva a UDF usando funções nativas, se puder. Caso contrário, repartition() o DataFrame antes de aplicar a UDF. Veja UDFs lentas.
  • Uma função de janela sem PARTITION BY. Sem uma cláusula PARTITION BY, a janela abrange todo o dataset, portanto, uma tarefa processa todas as linhas. Adicione uma cláusula PARTITION BY se a sua lógica permitir.
  • Tipo de arquivo que não pode ser dividido. O Spark não consegue ler arquivos como arquivos gzip em várias partes, por isso uma tarefa grande lê cada arquivo. Se você ler os mesmos arquivos repetidamente, ingira-os uma vez em uma tabela Delta Lake e query a tabela.
  • A opção multiLine em leituras JSON ou CSV. Defina multiLine apenas quando os registros abrangerem várias linhas. Consulte Ler arquivos JSON com várias linhas.
  • Inferência de esquema em um arquivo grande. Especifique o esquema em vez de inferi-lo. Consulte Specify a schema.
  • repartition(1) ou coalesce(1). Esses forçam todos os dados em uma partição. Remova-os ou use mais partições, a menos que precise de um único arquivo de saída.