1. Antecedentes:
La implementación de tareas de Flink usa un clúster independiente basado en k8s. Primero implemente el clúster de Flink en el contenedor y luego envíe la tarea de Flink. El envío de la tarea de Flink se realiza simultáneamente con la creación y el registro del administrador de tareas.
Dos, el problema
Si el clúster tiene 35 administradores de tareas y 140 ranuras, y el paralelismo de un vértice es <140, las tareas que pertenecen al vértice se distribuyen de manera desigual en los administradores de tareas, lo que genera una carga de nodo desequilibrada.
Como sigue,
-
La topología flink tiene 5 vértices, dos de los cuales tienen un paralelismo de 140 y los otros tres se establecen en 10, 30, 35 según el número de particiones kafka. El paralelismo máximo de la tarea es 140, y la configuración de recursos de la tarea es: 35 [4 core 8 gb] nodos taskManager.
-
Se puede encontrar a través de la interfaz de usuario web que incluso si cluster.evenly-spread-out-slots: true está configurado , las otras tres tareas de vértice aún se programarán para el mismo administrador de tareas.
3. Método de optimización
1. Análisis de problemas
- La pregunta de apelación se puede simplificar a:
Supongamos que la lógica de una topología de tareas es: Vértice A(p=2)->Vértice B(p=4)->Vértice C(p=2).
Basado en la estrategia de división de compartir ranuras y prioridad de transmisión de datos locales, se divide en cuatro ExecutionSlotSharingGroup : {A1, B1, C1}, {A2, B2, C2}, {B3}, {B4},
si la configuración de recursos se divide cada administrador de tareas Para 2 ranuras, pueden ocurrir las siguientes asignaciones:
Ranura 1 | Ranura2 | |
---|---|---|
Administrador de tareas1 | {A1, B1, C1} | {A2, B2, C2} |
Administrador de tareas2 | {B3} | {B4} |
La división de ranuras actual consiste en dividir la memoria de manera uniforme y no hay límite para la CPU. La distribución de atractivos conducirá a una carga de nodos desequilibrada. Si las tareas A y C consumen más recursos informáticos, TaskManager1 se convertirá en el cuello de botella de la informática. Idealmente, esperamos que el método de distribución sea:
Ranura 1 | Ranura2 | |
---|---|---|
Administrador de tareas1 | {A1, B1, C1} | {B3} |
Administrador de tareas2 | {A2, B2, C2} | {B4} |
2. Optimización
modificar politica
- Al solicitar espacios para ExecutionSlotSharingGroup , primero ordénelos por la cantidad de tareas que contienen y priorice los grupos con más tareas.
- Retrasar la programación de tareas, esperar a que la cantidad de TaskManagers registrados sea lo suficientemente grande como para distribuir uniformemente ExecutionSlotSharingGroup y luego solicitar Slots para ellos
Efecto
- Programación optimizada de tareas: múltiples tareas del mismo vértice se programan uniformemente en diferentes nodos del administrador de tareas
4. Comparación de rendimiento
1. Comparación de carga de CPU
-
Antes de la optimización: la carga de la CPU entre los nodos está relativamente distribuida y algunos nodos están en un estado de carga alta del 100 % durante mucho tiempo
-
Después de la optimización: la carga de la CPU entre los nodos está relativamente concentrada y los nodos no estarán en un estado de carga del 100 % durante mucho tiempo.
1.2 Agregar otra comparación de uso de CPU
En el diagrama de topología se puede ver que hay dos tareas con diferentes grados de paralelismo de 200/ 480. Al equilibrar el grupo compartido de tareas, se realiza el equilibrio de carga de la CPU de cada nodo tm, de modo que posteriormente podemos comprimir la cuota de recursos de tm .
2. acumulación de datos
Después de la optimización, la acumulación de datos se reduce a la mitad en comparación con antes, con una mejor capacidad de procesamiento y una menor latencia de datos en las mismas condiciones de recursos.
- Antes de la optimización:
- Optimizado:
6. Pensando
1. Saldo de tareas
Para topología: Vértice A(p=3)->Vértice B(p=4)->Vértice C(p=1). se distribuirá de la siguiente manera
Ranura 1 | Ranura2 | |
---|---|---|
Administrador de tareas1 | {A1, B1, C1} | {A3, B3} |
Administrador de tareas2 | {A2,B2} | {B4} |
Vertex B->Vertex C tiene cuatro canales de transmisión de datos (B1->C1), (B2->C1), (B3->C1), (B4->C1), para conexiones no directas, sin importar qué subtarea esté asignado a En el grupo, hay al menos tres canales que requieren comunicación entre nodos.
Entonces, si equilibras las tareas primero al agrupar: {A1, B1}, {A3, B3}, {A2, B2}, {B4, C1}, no importa cómo las programes después, estarán equilibradas. Pero cuando la tarea num% slot num ! = 0, todavía hay una situación en la que las tareas se reúnen en una sola tm.
2. Mejoras a la programación diferida
Durante el período de flink que genera el plan de ejecución, la estrategia de retraso se genera de acuerdo con la lógica de la topología para reducir la percepción de la operación del usuario.