[Spark] Principio de ejecución de la tarea Spark

DAGScheduler: de acuerdo con la operación de dependencia amplia, divida el escenario y encapsule las tareas en el escenario en un conjunto de prueba

TaskScheduler: reciba la etapa de programación presentada por DAGScheduler, envíe la tarea al nodo y ejecute la tarea en el nodo.

1) Realice varias operaciones de conversión para RDD, la operación de acción desencadenará la generación de trabajo, construirá un gráfico DAG basado en la relación de sangre RDD, DAGScheduler es responsable de analizar el gráfico DAG,

2) DAGScheduler divide el DAG en etapas interdependientes de acuerdo con la amplia dependencia, cada etapa contiene varias tareas y las tareas de cada etapa forman un conjunto de tareas, que se envía a TaskScheduler para su programación.

DAGScheduler calcula la estrategia de programación óptima, como elegir una estrategia de localización de datos.

DAGScheduler monitorea el proceso de programación. Si una etapa falla, DAGScheduler es responsable de reenviar esta etapa.

3) Cada TaskScheduler solo sirve un SparkContext. TaskScheduler recibe el conjunto de tareas distribuido desde DAGScheduler y lo distribuye a cada Ejecutor para su ejecución. TaskScheduler es responsable de monitorear el estado de ejecución de la tarea y el mecanismo de reintento de la tarea.

4) El ejecutor recibe el conjunto de tareas de TaskScheduler, una tarea se entrega a un hilo para su ejecución y la información de la tarea se devuelve a TaskScheduler cuando se completa la tarea.

ShuffleMapTask devuelve un objeto MapStatus en lugar del resultado en sí; los resultados devueltos por ResultTask se refieren a lo siguiente.

Obtenga resultados de ejecución

Para el resultado del cálculo devuelto por el ejecutor:

1) Genere el tamaño del resultado (∞, 1GB), el resultado se descarta directamente, establecido por spark.driver.maxResultSize.

2) El tamaño del resultado generado [1GB, 128MB-200KB]; el tamaño generado es igual a 128MB-200KB, el resultado se almacena en el BlockManager con taskId como el número, y luego el número se envía al terminal Driver.

3) El tamaño del resultado generado (128MB-200KB, 0) se envía directamente a la terminal del controlador a través de Netty.

 

Divida la etapa de programación:

 

 


Atraviese cada RDD dependiente según la amplitud primero

1) Cuando se envía para ejecutarse en SparkContext, se procesa hadleJobSubmitted en DAGScheduler, se encuentra el último RDD en este método y se llama al método getParentStage.

2) El método getParentStage determina si hay una operación aleatoria en la especie de árbol dependiente de rddG. Se encuentra que la operación de unión es una operación aleatoria, y los RDD para obtener la operación son rddB y rddF.

3) Use el método getAncesterShuffleDependencies para recorrer desde rddB hacia adelante y encontrar que no hay una operación aleatoria en la rama de dependencia, es decir, no hay una dependencia amplia. Llame al método newOrUsedShuffleStage para generar la etapa de programación ShuffleMapStage0.

4) Use el método getAncesterShuffleDependencies para recorrer hacia adelante desde rddF y descubra que la rama de dependencia tiene un amplio grupo de operaciones de dependenciaBy para dividir rddD, rddC es ShuffleMapStage1, rddE, rddF es ShuffleMapStage2.

5) Finalmente, se genera ResultStage3 de rddG

Comprometer horario

La última etapa de programación del ejemplo, ReusltStage3, se obtuvo en el método handleJobSubmitted, y la etapa de programación se envió a través del método submitStage.
En el método submitStage, primero cree una instancia de trabajo y luego determine si hay una etapa de programación principal en la etapa de programación. Dado que ReusltStage3 tiene dos etapas de programación principal, ShuffleMapStage0 y ShuffleMapStage2, no puede enviar inmediatamente la etapa de programación para ejecutar, y poner ReusltStage3 en la cola de espera para esperar Esperando etapas.
Al llamar al método submitStage de forma recursiva, puede saber que ShuffleMapStage0 no tiene una etapa de programación principal, y ShuffleMapStage2 tiene una etapa de programación principal, ShuffleMapStage1, de modo que ShuffleMapStage2 se agrega a la lista de esperaStage, y ShuffleMapStage0 y ShuffleMapSing1 están preparando el método por primera vez. .
La tarea Ejecutor envía un mensaje cuando se completa la ejecución de la tarea, y cuando el planificador, como DAGScheduler, actualiza el estado, verifica el funcionamiento de la fase de programación. Dado que la etapa de programación principal de ReusltStage3 no está completa, la segunda etapa de programación solo envía ShuffleMapStage2 para que se ejecute.
Cuando ShuffleMapStage2 termina de ejecutarse, la etapa de programación principal de ResultStage3 se completa en este momento y la operación de programación se envía para completarse.
å¨è¿éæå ¥ å¾çæè¿ °

Cinco tareas de presentación

  1. En la etapa de envío, la primera llamada es ShuffleMapStage0 [ShuffleMapStage0 se dividirá en ShuffleMapStage (0,0), ShuffleMapStage (0,1) y ShuffleMapStage1 también se dividirá en dos tareas] y ShuffleMapStage1, suponiendo Las etapas tienen solo dos particiones, ShuffleMapStage0 es TaskSet0, ShuffleMapStage1 es TaskSet1, y cada TaskSet tiene dos tareas para ejecutar.
  2. TaskScheduler recibe los conjuntos de tareas TaskSet0 y TaskSet1 enviados, construye TaskSetManager0 y TaskSetManager1 en el método submitTasks, los coloca en el grupo de programación del sistema y realiza la programación de acuerdo con el algoritmo de programación establecido por el sistema (FIFO o FAIR)
  3. En el método ResourceOffers de TaskSchedulerImpl, los recursos se asignan de acuerdo con el principio de proximidad: a cada tarea se le asigna código de ejecución, división de datos y recursos de procesamiento. Use el método launchTasks de CoarseGrainedSchedulerBackend para enviar la tarea a CoarseGrainedExecutorBackend en el nodo Trabajador para llamar a su Ejecutor para ejecutar la tarea
  4. ShuffleMapStage0, ShuffleMapStage1 se completan, ShuffleMapStage2, ResultStage3 realizará los pasos 1-3, pero ReduceStage3 genera ResultTask

Inserte la descripción de la imagen aquí

Seis tareas

Cuando CoarseGrainedExecutorBackend recibe el mensaje LaunchTask, llamará al método ExeTunch launchTask para su procesamiento. En el método launchTask de Executor, inicialice un TaskRunner para encapsular la tarea, que se usa para administrar los detalles del tiempo de ejecución de la tarea, y luego coloque el objeto TaskRunner en el ThreadPool para ejecutarlo.

Para ShuffleMapTask, su resultado de cálculo se escribirá en BlockManager y finalmente se devolverá a DAGScheduler es un MapStatus. Este objeto gestiona la información de almacenamiento relacionada de los resultados de la operación ShuffleMapTask almacenados en el BlockManager, en lugar de los resultados del cálculo, y esta información de almacenamiento se convertirá en la base de los datos de entrada necesarios para la siguiente etapa de la tarea.

 

 

 

Publicado 61 artículos originales · ganado elogios 2 · Vistas 7302

Supongo que te gusta

Origin blog.csdn.net/hebaojing/article/details/104052360
Recomendado
Clasificación