Estoy tratando de entender la relación entre la cantidad de núcleos y la cantidad de ejecutores cuando se ejecuta un trabajo de Spark en YARN.
El entorno de prueba es el siguiente:
- Número de nodos de datos: 3
- Especificaciones de la máquina del nodo de datos:
- CPU: Core i7-4790 (# de núcleos: 4, # de hilos: 8)
- RAM: 32 GB (8 GB x 4)
- HDD: 8 TB (2 TB x 4)
Red: 1 Gb
Versión Spark: 1.0.0
Versión de Hadoop: 2.4.0 (Hortonworks HDP 2.1)
Generar flujo de trabajo: sc.textFile -> filter -> map -> filter -> mapToPair -> reduceByKey -> map -> saveAsTextFile
Datos de entrada
- Tipo: archivo de texto único
- Tamaño: 165GB
- Número de líneas: 454,568,833
Salida
- Número de líneas después del segundo filtro: 310,640,717
- Número de líneas del archivo de resultados: 99,848,268
- Tamaño del archivo de resultados: 41 GB
El trabajo se ejecutó con las siguientes configuraciones:
--master yarn-client --executor-memory 19G --executor-cores 7 --num-executors 3
(Ejecutores por nodo de datos, use tanto como núcleos)--master yarn-client --executor-memory 19G --executor-cores 4 --num-executors 3
(# de núcleos reducidos)--master yarn-client --executor-memory 4G --executor-cores 2 --num-executors 12
(menos núcleo, más ejecutor)
Tiempos transcurridos:
50 min 15 seg
55 min 48 seg
31 min 23 seg
Para mi sorpresa, (3) fue mucho más rápido.
Pensé que (1) sería más rápido, ya que habría menos comunicación entre ejecutores al barajar.
Aunque el número de núcleos de (1) es menor que (3), el número de núcleos no es el factor clave ya que 2) funcionó bien.
(Se agregaron los siguientes después de la respuesta de pwilmot).
Para la información, la captura de pantalla del monitor de rendimiento es la siguiente:
- Resumen del nodo de datos de Ganglia para (1): el trabajo comenzó a las 04:37.
- Resumen de nodo de datos de Ganglia para (3): el trabajo comenzó a las 19:47. Por favor ignore el gráfico antes de ese momento.
El gráfico se divide aproximadamente en 2 secciones:
- Primero: desde el principio para reducir ByKey: CPU intensiva, sin actividad de red
- Segundo: después de reduceByKey: CPU baja, se realiza la E / S de red.
Como muestra el gráfico, (1) puede usar tanta potencia de CPU como se le dio. Por lo tanto, podría no ser el problema del número de subprocesos.
¿Cómo explicar este resultado?