apache-spark spark-streaming apache-spark-1.4

Cómo optimizar el derrame aleatorio en la aplicación Apache Spark



apache-spark spark-streaming (1)

Estoy ejecutando una aplicación de transmisión Spark con 2 trabajadores. La aplicación tiene una unión y una unión de operaciones.

Todos los lotes se están completando con éxito, pero notaron que las métricas de derrames aleatorios no son consistentes con el tamaño de datos de entrada o el tamaño de los datos de salida (la memoria de derrame es más de 20 veces).

Encuentre los detalles de la etapa de chispa en la imagen a continuación:

Después de investigar sobre esto, descubrió que

El derrame aleatorio ocurre cuando no hay suficiente memoria para los datos aleatorios.

Shuffle spill (memory) - tamaño de la forma deserializada de los datos en la memoria en el momento del derrame

shuffle spill (disk) - tamaño de la forma serializada de los datos en el disco después del derrame

Dado que los datos deserializados ocupan más espacio que los datos serializados. Entonces, Shuffle spill (memoria) es más.

Notó que este tamaño de memoria de derrame es increíblemente grande con grandes datos de entrada .

Mis consultas son:

¿Este derrame impacta el rendimiento considerablemente?

¿Cómo optimizar este derrame de memoria y disco?

¿Hay alguna propiedad de chispa que pueda reducir / controlar este enorme derrame?


Aprender a ajustar el rendimiento de Spark requiere bastante investigación y aprendizaje. Hay algunos buenos recursos que incluyen este video . Spark 1.4 tiene algunos mejores diagnósticos y visualización en la interfaz que pueden ayudarte.

En resumen, se derrama cuando el tamaño de las particiones RDD al final de la etapa excede la cantidad de memoria disponible para el búfer de mezcla.

Usted puede:

  1. Vuelva a repartition() manualmente repartition() su etapa anterior para que tenga particiones más pequeñas a partir de la entrada.
  2. Aumenta el almacenamiento intermedio de mezcla al aumentar la memoria en tus procesos de ejecutor ( spark.executor.memory )
  3. Aumente el almacenamiento intermedio de mezcla al aumentar la fracción de memoria del ejecutor asignada a él ( spark.shuffle.memoryFraction ) del valor predeterminado de 0.2. Debes devolver spark.storage.memoryFraction .
  4. Aumente el almacenamiento intermedio de mezcla por subproceso al reducir la proporción de subprocesos de trabajo ( SPARK_WORKER_CORES ) a la memoria del ejecutor

Si hay un experto escuchando, me gustaría saber más acerca de cómo interactúan los ajustes de MemoryFraction y su alcance razonable.