Arquitectura del clúster Flink
La comunicación entre clústeres de Flink se gestiona a través del sistema Akka Actor. El intercambio de datos entre Client-JobManager, JobManager-TaskManager y TaskManager se implementa en base a Netty.
La función principal del cliente es compilar la aplicación por lotes o de transmisión en un gráfico de flujo de datos (también llamado JobGraph) y enviarlo al JobManager. En concreto, las principales funciones del cliente son las siguientes:
JobManager es responsable de coordinar la ejecución distribuida de las aplicaciones Flink, como programación de tareas, coordinación de puntos de control, coordinación de conmutación por error, etc. Las funciones específicas son las siguientes:
Los principales componentes funcionales dentro de JobManager son los siguientes:
Un clúster de Flink tiene al menos un JobManager. En modo de implementación de alta disponibilidad, puede haberlo. Múltiples JobManagers, pero solo hay un JobManager como líder y los demás como sustitutos.
El administrador de tareas se utiliza principalmente para realizar tareas de flujo de datos y almacenar e intercambiar flujos de datos. La ranura de tareas en el administrador de tareas es la unidad de programación de recursos más pequeña del clúster. La cantidad de espacios para tareas en el administrador de tareas representa la cantidad de tareas que el administrador de tareas puede procesar simultáneamente.
Las funciones principales de TaskManager son las siguientes:
El cliente mencionado anteriormente, JobManager y TaskManager, tienen el mismo componente, es decir, Actor System, que se utiliza para la interacción. paso de mensajes de nodo.
Para la ejecución distribuida de tareas, Flink coloca operadores concatenables en las tareas y cada tarea es ejecutada por un hilo.
Poner operadores concatenables en tareas es una optimización muy efectiva. Dado que reduce la sobrecarga de conmutación y la sobrecarga de caché entre subprocesos, puede mejorar el rendimiento y al mismo tiempo reducir la latencia.
La figura anterior muestra el JobGraph del flujo de datos de la aplicación. La parte superior es la vista lógica del flujo de datos, el JobGraph, y la parte inferior es el JobGraph con semántica de concurrencia. Task representa un operador que realiza tareas en un flujo de datos, mientras que SubTask representa la misma tarea. Operador (u operador de cadena) para tareas concurrentes, por ejemplo, el operador de cadena del mapa fuente anterior representa una tarea y el mapa fuente [1] representa las subtareas de la tarea.
Cada administrador de tareas en el clúster de Flink es un proceso JVM. El administrador de tareas puede ejecutar una o más tareas. La cantidad de tareas que el administrador de tareas puede ejecutar está representada por la ranura de tarea.
Cada ranura de tarea representa un subconjunto fijo de los recursos del TaskManager. Por ejemplo, si hay tres ranuras de tarea en el TaskManager, a cada ranura de tarea se le asigna 1/3 de la memoria del TaskManager.
Si un TaskManger tiene solo una ranura de tarea, esto significa que cada grupo de tareas (debido a que la ranura de tarea se disfruta mucho, se llama grupo) está aislado en el nivel de proceso JVM.
Si un TaskManager tiene múltiples espacios para tareas, estas tareas pueden compartir recursos JVM, como enlaces TPC, información de latidos, etc., y también pueden compartir conjuntos de datos y estructuras de datos, lo que reduce la carga de cada tarea.
De forma predeterminada, Flink permite que subtareas de diferentes tareas compartan espacios siempre que pertenezcan al mismo trabajo. Con ranuras compartidas, una sola ranura puede contener toda la canalización de un trabajo, como la primera ranura de tarea en el primer Administrador de tareas a continuación, que se divide entre mapa fuente[1], keyby-window[1] y toda la canalización de el fregadero [1] se comparte, por lo que toda la canalización minimiza la comunicación de datos entre subprocesos/procesos.
***Además de poder ejecutar todo el pipeline, disfrutar de las slots tiene dos ventajas: