¿Qué son los trabajadores, ejecutores y núcleos en el clúster Spark Standalone?

Resuelto Manikandan Kannan asked hace 9 años • 2 respuestas

Leí la descripción general del modo de clúster y todavía no puedo comprender los diferentes procesos en el clúster independiente de Spark y el paralelismo.

¿El trabajador es un proceso JVM o no? Ejecuté bin\start-slave.shy descubrí que generaba el trabajador, que en realidad es una JVM.

Según el enlace anterior, un ejecutor es un proceso iniciado para una aplicación en un nodo trabajador que ejecuta tareas. Un ejecutor también es una JVM.

Estas son mis preguntas:

  1. Los ejecutores son por solicitud. ¿Cuál es entonces el papel de un trabajador? ¿Se coordina con el ejecutor y comunica el resultado al conductor? ¿O el conductor habla directamente con el albacea? Si es así, ¿cuál es entonces el propósito del trabajador?

  2. ¿Cómo controlar la cantidad de ejecutores de una aplicación?

  3. ¿Se puede hacer que las tareas se ejecuten en paralelo dentro del ejecutor? Si es así, ¿cómo configurar la cantidad de subprocesos para un ejecutor?

  4. ¿Cuál es la relación entre un trabajador, ejecutores y núcleos de ejecutores (-total-executor-cores)?

  5. ¿Qué significa tener más trabajadores por nodo?

Actualizado

Tomemos ejemplos para entender mejor.

Ejemplo 1: un clúster independiente con 5 nodos trabajadores (cada nodo tiene 8 núcleos) Cuando inicio una aplicación con la configuración predeterminada.

Ejemplo 2 La misma configuración de clúster que en el ejemplo 1, pero ejecuto una aplicación con la siguiente configuración --executor-cores 10 --total-executor-cores 10.

Ejemplo 3 La misma configuración de clúster que en el ejemplo 1, pero ejecuto una aplicación con la siguiente configuración --executor-cores 10 --total-executor-cores 50.

Ejemplo 4 La misma configuración de clúster que en el ejemplo 1, pero ejecuto una aplicación con la siguiente configuración --executor-cores 50 --total-executor-cores 50.

Ejemplo 5 La misma configuración de clúster que en el ejemplo 1, pero ejecuto una aplicación con la siguiente configuración --executor-cores 50 --total-executor-cores 10.

En cada uno de estos ejemplos, ¿cuántos ejecutores? ¿Cuántos hilos por ejecutor? ¿Cuántos núcleos? ¿Cómo se decide el número de albaceas por solicitud? ¿Es siempre el mismo que el número de trabajadores?

Manikandan Kannan avatar Sep 17 '15 10:09 Manikandan Kannan
Aceptado

ingrese la descripción de la imagen aquí

Spark utiliza una arquitectura maestro/esclavo. Como puede ver en la figura, tiene un coordinador central (Conductor) que se comunica con muchos trabajadores distribuidos (ejecutores). El controlador y cada uno de los ejecutores se ejecutan en sus propios procesos Java.

CONDUCTOR

El controlador es el proceso donde se ejecuta el método principal. Primero convierte el programa de usuario en tareas y luego programa las tareas en los ejecutores.

EJECUTORES

Los ejecutores son procesos de nodos trabajadores encargados de ejecutar tareas individuales en un trabajo Spark determinado. Se inician al comienzo de una aplicación Spark y normalmente se ejecutan durante toda la vida útil de una aplicación. Una vez que han ejecutado la tarea envían los resultados al conductor. También proporcionan almacenamiento en memoria para los RDD que los programas de usuario almacenan en caché a través del Administrador de bloques.

FLUJO DE EJECUCIÓN DE LA APLICACIÓN

Teniendo esto en cuenta, cuando envías una aplicación al clúster con Spark-Submit, esto es lo que sucede internamente:

  1. Una aplicación independiente inicia y crea una SparkContextinstancia (y es sólo entonces cuando puedes llamar a la aplicación un controlador).
  2. El programa controlador solicita recursos al administrador del clúster para iniciar los ejecutores.
  3. El administrador del clúster lanza ejecutores.
  4. El proceso del controlador se ejecuta a través de la aplicación del usuario. Dependiendo de las acciones y transformaciones sobre los RDD, las tareas se envían a los ejecutores.
  5. Los ejecutores ejecutan las tareas y guardan los resultados.
  6. Si algún trabajador falla, sus tareas se enviarán a diferentes ejecutores para ser procesadas nuevamente. En el libro "Learning Spark: Lightning-Fast Big Data Analysis" hablan sobre Spark y Fault Tolerance:

Spark se ocupa automáticamente de las máquinas lentas o fallidas volviendo a ejecutar tareas lentas o fallidas. Por ejemplo, si el nodo que ejecuta una partición de una operación map() falla, Spark lo volverá a ejecutar en otro nodo; e incluso si el nodo no falla sino que simplemente es mucho más lento que otros nodos, Spark puede lanzar de manera preventiva una copia "especulativa" de la tarea en otro nodo y tomar su resultado si finaliza.

  1. Con SparkContext.stop() del controlador o si el método principal sale/falla, todos los ejecutores finalizarán y el administrador del clúster liberará los recursos del clúster.

TUS PREGUNTAS

  1. Cuando se inician los ejecutores se registran con el conductor y a partir de ahí se comunican directamente. Los trabajadores son los encargados de comunicar al responsable del cluster la disponibilidad de sus recursos.

  2. En un clúster YARN puedes hacerlo con --num-executors. En un clúster independiente obtendrás un ejecutor por trabajador a menos que juegues con spark.executor.cores y un trabajador tenga suficientes núcleos para albergar más de un ejecutor. (Como señaló @JacekLaskowski, --num-executors ya no se utiliza en YARN https://github.com/apache/spark/commit/16b6d18613e150c7038c613992d80a7828413e66 )

  3. Puedes asignar el número de núcleos por ejecutor con --executor-cores

  4. --total-executor-cores es el número máximo de núcleos ejecutores por aplicación

  5. Como dijo Sean Owen en este hilo : "no hay una buena razón para ejecutar más de un trabajador por máquina". Por ejemplo, tendría muchas JVM en una máquina.

ACTUALIZAR

No he podido probar estos escenarios, pero según la documentación:

EJEMPLO 1: Spark adquirirá con avidez tantos núcleos y ejecutores como ofrezca el programador. Entonces, al final obtendrás 5 ejecutores con 8 núcleos cada uno.

EJEMPLO 2 a 5: Spark no podrá asignar tantos núcleos como se solicita en un solo trabajador, por lo que no se lanzarán ejecutores.

Marco avatar Sep 17 '2015 10:09 Marco

Así es como funciona Apache Spark internamente:

ingrese la descripción de la imagen aquí

Sharhabeel Hamdan avatar Jan 30 '2020 14:01 Sharhabeel Hamdan