Esta serie incluye:
- [Big Data] Explicación detallada de Flink (1): conceptos básicos
- [Big Data] Explicación detallada de Flink (2): Parte principal I
- [Big Data] Explicación detallada de Flink (3): Parte principal II
- [Big Data] Explicación detallada de Flink (4): Parte principal III
- [Big Data] Explicación detallada de Flink (5): Capítulo principal IV
- [Big Data] Explicación detallada de Flink (6): Código fuente Parte I
Explicación detallada de Flink (6): Código fuente Ⅰ
- 55. ¿Cuál es el proceso de envío de trabajos de Flink?
- 56. ¿Cuántas formas existen de enviar trabajos de Flink?
- 57. ¿Cuándo se genera Flink JobGraph?
- 58. ¿Qué proceso pasó JobGraph antes de enviar el clúster?
- 59. Viendo que mencionaste PipeExecutor, ¿qué clases de implementación tiene?
- 60. ¿Cuáles son las características del modo de presentación local y cómo se realiza?
- 61. ¿Cuáles son las modalidades de envío remoto?
- 62. ¿Presentar brevemente el modo independiente?
- 63. ¿Cuénteme sobre el método de envío del grupo de hilos?
- 64. ¿Cuáles son las características del modo de sesión de hilo?
- 65. ¿Cuáles son las características del modo hilo por trabajo?
- 66. ¿Cuáles son las características del modo de aplicación del hilo?
- 67. ¿Cuénteme en detalle sobre el proceso de envío de la sesión de hilo?
- 68. ¿Cuénteme en detalle sobre el proceso de envío de hilo por trabajo?
55. ¿Cuál es el proceso de envío de trabajos de Flink?
Proceso de envío de Flink:
- En , inicie la función en , genere Flink StreamGraph y JobGraph
Flink Client
a través de la reflexión y envíe JobGraph al clúster de Flink.jar
main
- Después de que el clúster de Flink recibe el JobGraph (
JobManager
recibido), traduce el JobGraph en un ExecutionGraph, luego comienza a programar y comienza a consumir datos después de que el inicio sea exitoso.
En resumen: proceso de ejecución central de Flink, las llamadas a las API del usuario se pueden convertir a StreamGraph
→ JobGraph
→ ExecutionGraph
.
56. ¿Cuántas formas existen de enviar trabajos de Flink?
El envío de trabajos de Flink se divide de dos formas:
- Modo local : es decir, el modo de envío local, que ejecuta el código directamente en IDEA.
- Método de envío remoto : dividido en
standalone
método,yarn
método,K8s
método. Entre ellos,yarn
el método se divide en tres modos de envío:yarn-per-job
modo,yarn-session
modo,yarn-application
modo.
57. ¿Cuándo se genera Flink JobGraph?
StreamGraph y JobGraph se Flink Client
generan en el lado del cliente, es decir, antes de enviarse al clúster. El diagrama esquemático es el siguiente:
58. ¿Qué proceso pasó JobGraph antes de enviar el clúster?
- Los usuarios inician el clúster de Flink, usan la línea de comando para enviar trabajos y ejecutarlos
flink run -c WordCount xxx.jar
. - Después de ejecutar la línea de comando, la entrada se invocará a través
run
del scriptCliFrontend
, que activará el método en el archivoCliFrontend
enviado por el usuario , luego lo entregará al método y finalmente activará una ejecución específica de acuerdo con el modo de envío.jar
main
PipelineExecuteor
execute
PipelineExecutor
- Según la
PipelineExecutor
ejecución específica, el código del usuario se compilará para generar StreamGraph y Jobgraph se generará después de la optimización.
El diagrama de flujo específico es el siguiente:
59. Viendo que mencionaste PipeExecutor, ¿qué clases de implementación tiene?
PipeExecutor
En Flink se llama ejecutor de canalización , es una interfaz y Flink Client
una parte importante del envío de trabajos al clúster después de que se genera JobGraph. Como se mencionó anteriormente, hay varias formas de enviar trabajos al clúster, el método más utilizado es yarn
el método, yarn
que incluye 3 33 modos de envío, principalmente usandosession
modo,per-job
modo. application
En el modo, JobGraph se genera en el clúster.
Entonces, PipeExecutor
la clase de implementación es como se muestra en la siguiente figura: (presione el código y CTRL+H
aparecerá)
Además de los dos modos anteriores en el cuadro rojo, utilícelo cuando ejecute Flink MiniCluster en el entorno IDEA para depurar LocalExecutor
.
60. ¿Cuáles son las características del modo de presentación local y cómo se realiza?
Local es el método de envío que se ejecuta en el entorno local de IDEA. No en el grupo. Utilizado principalmente para depuración, el diagrama esquemático es el siguiente:
-
Los programas de Flink
JobClient
son enviados por . -
JobClient
Envíe tareas aJobManager
. -
JobManager
Responsable de coordinar la asignación de recursos y la ejecución del trabajo. Una vez completada la asignación de recursos, la tarea se enviará al correspondienteTaskManager
. -
TaskManager
Inicia un hilo para comenzar a ejecutarseTaskManager
eJobManager
informará los cambios de estado a , como iniciado, en progreso o completado. -
Una vez completada la ejecución del trabajo, los resultados se envían al cliente.
Análisis del código fuente: a través de Flink 1.12.2 1.12.21.12.2 Se analiza el código fuente.
(1) Cree y obtenga el StreamExecutionEnvironment
objeto correspondiente: LocalStreamEnvironment
.
Invoca StreamExecutionEnvironment
el método del objeto execute
.
(2) Obtenga StreamGraph.
(3) Ejecute PipeLineExecutor
Get localExecutorFactory específico.
(4) Obtenga JobGraph.
Genere JobGraph de acuerdo con la clase de implementación LocalExecutor de localExecutorFactory.
La parte anterior está toda Flink Client
generada en . Dado que se envía en modo local, a continuación se creará un clúster MiniCluster y miniCluster.submitJob
el jobGraph que se enviará se especificará mediante .
(5) Cree una instancia del clúster MiniCluster.
(6) Devolución al JobClient
cliente.
Después de ejecutar lo anterior miniCluster.submitJob
para enviar JobGraph al clúster local, JobClient
se devolverá un cliente que JobClient
contiene información detallada de la aplicación, incluido el JobID, el estado de la aplicación, etc. Finalmente, regrese a la capa superior de ejecución de código y la clase correspondiente es StreamExecutionEnvironment
.
Lo anterior es el proceso de ejecución del código fuente del modo Local.
61. ¿Cuáles son las modalidades de envío remoto?
Método de envío remoto: dividido en método independiente , método Yarn y método K8 .
- Independiente : contiene
session
el esquema. - El método Yarn se divide en tres modos de envío:
yarn-per-job
modo,yarn-Session
modo,yarn-application
modo. - Modo K8 : contiene
session
modo.
62. ¿Presentar brevemente el modo independiente?
El modo independiente es el método de envío de versión independiente del clúster Flink . Solo se usa un nodo para el envío y el modo de sesión se usa comúnmente.
Envíe el comando de la siguiente manera:
bin/flink run org.apache.flink.WordCount xxx.jar
Client
El cliente envía tareas aJobManager
.JobManager
Responsable de solicitar los recursos necesarios para la operación de la tarea y gestionar tareas y recursos.JobManager
Distribuir tareas aTaskManager
ejecutar.TaskManager
Informar periódicamenteJobManager
del estado a .
63. ¿Cuénteme sobre el método de envío del grupo de hilos?
La presentación a través del grupo de hilos se divide en 3 33 formas de enviar:
session
modeloper-job
modeloapplication
modelo
64. ¿Cuáles son las características del modo de sesión de hilo?
Envíe el comando de la siguiente manera:
./bin/flink run -t yarn-session \
-Dyarn.application.id=application_XXXX_YY xxx.jar
modo de sesión de hilo : Todos los trabajos comparten recursos del clúster, aislamiento deficiente, cuello de botella de carga JM ymain
métodos se ejecutan en el cliente. Es adecuado para tareas cortas con tiempo de ejecución corto y ejecución frecuente. Solo hay un trabajo en el clústerJobManager
. Además, los trabajos se asignan aleatoriamenteTaskManager
.
Características: session-cluster
el modo debe iniciar el clúster primero, luego enviar el trabajo y luego solicitar un espacio de Yarn, y los recursos permanecerán sin cambios para siempre. Si el recurso está lleno, no se puede enviar el siguiente trabajo y solo se puede enviar normalmente después de que se completa uno de los trabajos en Yarn y se liberan los recursos. Todos los trabajos comparten Dispatcher
y ResourceManager
comparten recursos, lo que es adecuado para trabajos de pequeña escala y tiempo de ejecución corto.
65. ¿Cuáles son las características del modo hilo por trabajo?
Comando de confirmación:
./bin/flink run -t yarn-per-job --detached xxx.jar
modo hilo por trabajo : cada trabajo inicia el clúster de forma independiente, con buen aislamiento, equilibrio de carga JM ymain
el método se ejecuta en el cliente. Enper-job
el modo, hay uno para cada trabajoJobManager
yTaskManager
solo un trabajo para cada uno.
Características: Una tarea corresponde a un trabajo. Cada trabajo enviado solicitará recursos de Yarn individualmente de acuerdo con su propia situación hasta que se complete el trabajo. La falla de un trabajo no afectará el envío y funcionamiento normales del siguiente trabajo. Se aceptan solicitudes exclusivas Dispatcher
y de recursos a pedido. ResourceManager
Adecuado para trabajos de larga duración a gran escala.
66. ¿Cuáles son las características del modo de aplicación del hilo?
Envíe el comando de la siguiente manera:
./bin/flink run-application -t yarn-application xxx.jar
Modo de aplicación de hilo : cada trabajo inicia el clúster de forma independiente, con buen aislamiento, equilibrio de carga JM ymain
métodosJobManager
que se ejecutan en .
Tanto en yarn-per-job
el yarn-session
modo como, el cliente debe realizar los siguientes tres pasos, a saber:
- Obtenga las dependencias requeridas por el trabajo;
- Realizando un análisis ambiental y obteniendo un plan lógico, es decir
StreamGraph
→JobGraph
; - Cargue dependencias y JobGraph al clúster.
Solo después de que se completen, env.execute()
se activará el tiempo de ejecución de Flink para comenzar a ejecutar el trabajo a través del método. Si todos los usuarios envían trabajos en el mismo cliente, las dependencias más grandes consumirán más ancho de banda y la traducción de una lógica de trabajo más compleja a JobGraph también consumirá más CPU y memoria, y los recursos del cliente se convertirán en un cuello de botella.
Para solucionarlo, la comunidad implementó el modo Aplicación sobre la base del modo de implementación tradicional. Las tres cosas que originalmente requerían que hiciera el cliente se han transferido a JobManager
, es decir, main()
el método se ejecuta en el clúster (donde se encuentra el punto de entrada ApplicationClusterEntryPoint
), y el cliente solo necesita ser responsable de iniciar la solicitud de implementación.
En resumen, la comunidad Flink recomienda utilizar yarn-per-job
el modo o yarn-application
para enviar solicitudes.
67. ¿Cuénteme en detalle sobre el proceso de envío de la sesión de hilo?
El diagrama de flujo de envío es el siguiente:
1. Inicie el clúster
Flink Client
Yarn ResourceManager
Envíe la información de la tarea a .Flink Client
Cargue la configuración de la aplicación (Flink-conf.yaml
,, ) y los archivos relacionados (Flink Jar, archivos de clase de configuración, archivos Jarlogback.xml
delog4j.properties
usuario, objetos JobGraph, etc.) al HDFS de almacenamiento distribuido.Flink Client
Yarn ResourceManager
Envíe la información de la tarea a .
- Yarn inicia el clúster de Flink, haz 2 22 pasos:
- Al
Yarn Client
enviarYarn ResourceManager
una solicitud para que Flink cree un clúster,Yarn ResourceManager
asigne recursos de contenedor y notifique al correspondiente paraNodeManager
iniciar unoApplicationMaster
(cada vez que se envíe un trabajo de Flink, se iniciará unoApplicationMaster
),ApplicationMaster
que incluirá el que se está iniciando actualmenteJobManager
y el uso interno. del propio FlinkResourceManager
. JobManager
Se ejecuta en el proceso comoYarnSessionClusterEntryPoint
punto de entrada para el inicio del clúster. InicializaciónDispatcher
, que Flink utiliza internamenteResourceManager
, inicia los servicios RPC relacionados y espera a queFlink Client
JobGraph se envíe a través de la interfaz Rest.
- Al
2. Envío de trabajo
-
Flink Client
Dispatcher
Envíe el JobGraph compilado a través de Rest .Dispatcher
Es una interfaz Rest y no es responsable del trabajo real de programación y asignación. -
Dispatcher
Después de recibir JobGraph, cree uno para el trabajoJobMaster
, entregue el trabajoJobMaster
,JobMaster
sea responsable de la programación del trabajo, administre el ciclo de vida del trabajo y la tarea, y cree el ExecutionGraph (la versión paralelizada de JobGraph, la estructura de datos central de capa de programación).
Una vez ejecutados los dos pasos anteriores, el trabajo ingresa a la etapa de ejecución de programación.
3. Ejecución de la programación del trabajo
-
JobMaster
Solicite recursosResourceManager
y comience a programar ExecutionGraph. -
ResourceManager
Agregue solicitudes de recursos a la cola de espera eYarnResourceManager
inicie el proceso solicitando un nuevo Contenedor mediante latidoTaskManager
. -
YarnResourceManager
Inicie y luego cargue archivos Jar y otros recursos relacionados necesarios desde HDFS, comience en el contenedorTaskManager
yTaskManager
comienceTaskExecutor
. -
TaskManager
Después de comenzar,ResourceManager
regístrese e informe el estado de sus recursos de tragamonedas aResourceManager
. -
ResourceManager
Saque la solicitud de ranura de la cola de espera,TaskManager
confirme la disponibilidad de recursos e indique aTaskManager
qué ranura está asignadaJobMaster
. -
TaskManager
Responda aJobMaster
una ranura suya que pertenezca a su tarea yJobMaser
la ranura se almacenará en caché en SlotPool. -
JobMaster
Programe la tarea queTaskMnager
se ejecutará en la ranura.
68. ¿Cuénteme en detalle sobre el proceso de envío de hilo por trabajo?
Envíe el comando de la siguiente manera:
./bin/flink run -t yarn-per-job --detached xxx.jar
El diagrama de flujo de envío es el siguiente:
1. Inicie el clúster
Flink Client
Yarn ResourceManager
Envíe la información de la tarea a .Flink Client
Cargue la configuración de la aplicación (Flink-conf.yaml
,, ) y los archivos relacionados (Flink Jar, archivos de clase de configuración, archivos Jarlogback.xml
delog4j.properties
usuario, objetos JobGraph, etc.) al HDFS de almacenamiento distribuido.Flink Client
Yarn ResourceManager
Envíe la información de la tarea a .
- Yarn inicia el clúster de Flink, haz 2 2Operación de 2 pasos.
- Al
Yarn Client
enviarYarn ResourceManager
una solicitud para que Flink cree un clúster,Yarn ResourceManager
asigne recursos de contenedor y notifique al correspondiente paraNodeManager
iniciar unoApplicationMaster
(cada vez que se envíe un trabajo de Flink, se iniciará unoApplicationMaster
),ApplicationMaster
que incluirá el que se está iniciando actualmenteJobManager
y el uso interno. del propio FlinkResourceManager
. JobManager
Se ejecuta en el proceso comoYarnJobClusterEntryPoint
punto de entrada para el inicio del clúster. InicializaciónDispatcher
, que Flink utiliza internamenteResourceManager
, inicia los servicios RPC relacionados y espera a queFlink Client
JobGraph se envíe a través de la interfaz Rest.
- Al
2. Envío de trabajo
ApplicationMaster
IniciarDispatcher
,Dispatcher
iniciarResourceManager
yJobMaster
(este pasoJobMaster
es diferente de la Sesión,Dispatcher
el Cliente lo realiza en lugar de pasarlo).JobMaster
Responsable de la programación de trabajos, la gestión del ciclo de vida de trabajos y tareas y la construcción de ExecutionGraph (la versión paralelizada de JobGraph, la estructura de datos central de la capa de programación).
Una vez ejecutados los dos pasos anteriores, el trabajo ingresa a la etapa de ejecución de programación.
3. Ejecución de la programación del trabajo
-
JobMaster
Solicite recursos de SlotResourceManager
y comience a programar ExecutionGraph. -
ResourceManager
Agregue solicitudes de recursos a la cola de espera eYarnResourceManager
inicie el proceso solicitando un nuevo Contenedor mediante latidoTaskManager
. -
YarnResourceManager
Inicie, luego cargue archivos Jar y otros recursos relacionados necesarios desde HDFS y comience en el contenedorTaskManager
. -
TaskManager
Comience internamenteTaskExecutor
. -
TaskManager
Después de comenzar,ResourceManager
regístrese e informe el estado de sus recursos de tragamonedas aResourceManager
. -
ResourceManager
Saque la solicitud de ranura de la cola de espera,TaskManager
confirme la disponibilidad de recursos e indique aTaskManager
qué ranura está asignadaJobMaster
. -
TaskManager
Responda aJobMaster
una ranura suya que pertenezca a su tarea yJobMaser
la ranura se almacenará en caché en SlotPool. -
JobMaster
Programe la tarea queTaskMnager
se ejecutará en la ranura.