Etapa Long Spark con una sola tarea

Una etapa de larga duración con una sola tarea no tiene paralelismo. Mientras la tarea se ejecuta, una CPU realiza el trabajo y el resto del clúster puede estar inactivo. Añadir trabajadores no ayuda, porque Spark no puede repartir el trabajo entre ellos.

Utiliza esta página cuando la etapa más larga tenga exactamente una tarea. Si la fase tiene muchas tareas, compruebe si hay asimetría y desbordamiento. Consulte Asimetría y desbordamiento.

Causas comunes y correcciones

Una etapa de una sola tarea suele tener una de estas causas. Encuentra la que coincida con tu código y luego aplica la solución:

  • Un costoso UDF sobre datos pequeños. Una entrada pequeña puede acabar en una sola partición, así que una tarea ejecuta todo el UDF. Reescribe el UDF usando funciones nativas si puedes. De lo contrario, aplique repartition() al DataFrame antes de aplicar la UDF. Véase UDFs lentos.
  • Una función ventana sin PARTITION BY. Sin una PARTITION BY cláusula, la ventana abarca todo el conjunto de datos, así que una tarea procesa cada fila. Añade una PARTITION BY cláusula si tu lógica lo permite.
  • Un tipo de archivo que no se puede dividir. Spark no puede leer archivos como los archivos gzip divididos en varias partes, así que una tarea grande lee cada archivo. Si lees los mismos archivos repetidamente, ingiérelos una vez en una tabla Delta Lake y consulta la tabla en su lugar.
  • La opción multiLine en lecturas de JSON o CSV. Establezca multiLine solo cuando los registros abarquen varias líneas. Ver Leer archivos JSON de múltiples líneas.
  • Inferencia de esquema en un archivo grande. Especifica el esquema en lugar de inferirlo. Véase Especificar un esquema.
  • repartition(1) o coalesce(1). Esto obliga a que todos los datos se almacenen en una sola partición. Eliminalos o usa más particiones, a menos que necesites un único archivo de salida.