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

219

Leí la Descripción general del modo de clúster y todavía no puedo entender los diferentes procesos en el clúster autónomo de Spark y el paralelismo.

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

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

Estas son mis preguntas:

  1. Los ejecutores son por aplicación. Entonces, ¿cuál es 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 el propósito del trabajador entonces?

  2. ¿Cómo controlar el número de ejecutores para una aplicación?

  3. ¿Se pueden hacer que las tareas se ejecuten en paralelo dentro del ejecutor? Si es así, ¿cómo configurar el número de hilos para un ejecutor?

  4. ¿Cuál es la relación entre un trabajador, ejecutores y núcleos de ejecutor (--total-executeor-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 de trabajo (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-executeor-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-executeor-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-executeor-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-executeor-cores 10.

En cada uno de estos ejemplos, ¿Cuántos ejecutores? ¿Cuántos hilos por ejecutor? Cuantos núcleos ¿Cómo se decide el número de ejecutores por aplicación? ¿Es siempre igual al número de trabajadores?

Manikandan Kannan
fuente

Respuestas:

274

ingrese la descripción de la imagen aquí

Spark utiliza una arquitectura maestro / esclavo. Como puede ver en la figura, tiene un coordinador central (Driver) 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 de trabajadores a cargo de ejecutar tareas individuales en un trabajo Spark dado. Se inician al comienzo de una aplicación Spark y, por lo general, se ejecutan durante toda la vida útil de una aplicación. Una vez que han ejecutado la tarea, envían los resultados al controlador. También proporcionan almacenamiento en memoria para RDD que son almacenados en caché por programas de usuario a través de Block Manager.

APLICACIÓN FLUJO DE EJECUCIÓN

Con esto en mente, cuando envía una solicitud al clúster con spark-submit, esto es lo que sucede internamente:

  1. Una aplicación independiente se inicia e instancia una SparkContextinstancia (y es solo entonces cuando puede llamar a la aplicación 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 las tareas de RDD, se envían a los ejecutores.
  5. Los ejecutores ejecutan las tareas y guardan los resultados.
  6. Si algún trabajador falla, sus tareas serán enviadas 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 máquinas fallidas o lentas al volver a ejecutar tareas fallidas o lentas. Por ejemplo, si el nodo que ejecuta una partición de una operación map () se bloquea, Spark lo volverá a ejecutar en otro nodo; e incluso si el nodo no se bloquea pero es simplemente 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 eso termina.

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

TUS PREGUNTAS

  1. Cuando se inician los ejecutores, se registran con el controlador y desde ese momento se comunican directamente. Los trabajadores se encargan de comunicar al administrador del clúster la disponibilidad de sus recursos.

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

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

  4. --total-executeor-cores es el número máximo de núcleos de ejecutor 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". Tendría muchas JVM sentadas en una máquina, por ejemplo.

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 los ofrezca el programador. Así que 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 solicite en un solo trabajador, por lo tanto, no se ejecutarán ejecutores.

Marco
fuente
Gracias @Marco. Entonces, por lo general, uno no debe preocuparse por la memoria de almacenamiento dinámico en el trabajador, ya que solo administra los recursos del nodo.
Manikandan Kannan
8
¡Qué gran respuesta! Gracias @Marco. Según github.com/apache/spark/commit/… --num-executors ya no se usan en YARN.
Jacek Laskowski
1
@Marco gracias por una gran respuesta. ¿Puede ampliar el rol continuo del administrador de clúster mientras se ejecuta el controlador? ... Debe manejar el caso en que el conductor o los trabajadores o ambos se bloquean o dejan de responder, para saber qué recursos están disponibles.
Iain
1
@lain el conductor se pone en contacto con el administrador del clúster para la asignación de recursos y también solicita que el administrador del clúster lance a los ejecutores
Aravind Yarram
2
Gran respuesta. Puede encontrar información detallada sobre las chispas internas aquí github.com/JerryLead/SparkInternals/blob/master/EnglishVersion/…
Amar Gajbhiye
7

Así es como Apache Spark funciona internamente:

ingrese la descripción de la imagen aquí

Sharhabeel Hamdan
fuente