Flink | Explicación detallada del mecanismo de punto de control
1. Introducción a Checkpoint
El mecanismo Checkpoint de Flink es la piedra angular de su confiabilidad. Cuando una tarea falla durante la operación, se puede restaurar a un cierto estado antes de la falla según la información del punto de control, y luego la operación de la tarea se puede reanudar desde ese estado. En Flink, el mecanismo Checkpoint utiliza el algoritmo chandy-lamport (instantánea distribuida). A través del mecanismo Checkpoint, se garantiza la semántica Exactamente una vez dentro del programa Flink.
2. Explicación detallada del proceso del mecanismo Checkpoint
1. Inicio de la tarea
Suponemos que la tarea lee datos de un tema en Kafka, y este tema tiene 2 particiones, por lo que el grado de paralelismo de la tarea es 2. Según la paridad de los datos leídos, los datos se distribuyen en dos tareas para su suma.
En un momento determinado, el estado es el siguiente:
2. Iniciar Checkpoint
JobManager inicia Checkpoint según el intervalo de Checkpoint. En este momento, se enviará un mensaje de barrera a cada fuente. El valor en el mensaje representa el número de secuencia del punto de control. Este valor se incrementará cada vez que se inicie un nuevo punto de control.
3. El origen inicia el punto de control
Cuando el origen recibe el mensaje de barrera, guardará el estado actual (partición, desplazamiento) en StateBackend y luego informará la finalización del punto de control a JobManager. Luego, la Fuente transmitirá el mensaje de barrera a cada tarea descendente:
4.la tarea recibe la barrera
Cuando la tarea recibe la barrera enviada por una tarea ascendente (como la Fuente1 aquí), el los datos antes de la barrera ascendente continuarán procesándose, mientras que los mensajes enviados después de la barrera no se procesarán y se almacenarán en caché.
Mi comprensión de las barreras era vaga hasta que vi la imagen de abajo. El papel de la barrera es similar al del cartel de "Bienvenida" aquí. Se utiliza para distinguir a qué punto de control pertenecen los datos en la secuencia:
Podemos entenderlo como: pertenecen los datos antes de la barrera. a este punto de control, y los datos después de la barrera pertenecen a este punto de control. Los datos pertenecen al siguiente punto de control, por lo que los datos para el siguiente punto de control no deben calcularse durante este punto de control, por lo que los datos se almacenarán en caché.
5. Alineación de barreras
Si una tarea tiene múltiples entradas ascendentes, como aquí sum_even, que tiene dos fuentes Fuente, esperará después de recibir una barrera de una de las Fuentes. Llegan barreras de otras fuentes. Durante este período, los datos recibidos de la fuente de la barrera no se procesarán, solo se almacenarán en caché (datos 4 en la figura siguiente). Los datos enviados por la Fuente que no ha recibido la barrera aún se procesarán hasta que se reciba la barrera enviada por la Fuente. Este proceso se denomina alineación de barrera.
Si la barrera está alineada determina si el programa se implementa exactamente una vez o al menos una vez:
Si no se realiza la alineación de la barrera, entonces sum_even aquí recibirá la Fuente1 antes de recibir la barrera de la Fuente2. Los datos 4 no se almacenarán en caché, sino que se calcularán directamente. El estado de sum_even se cambiará a 12. Cuando se reciba la barrera de Source2, el estado sum=12 de sum_even se mantendrá. Si este punto de control tiene éxito y la tarea falla antes del siguiente punto de control, se restaurará en función de este punto de control. El estado en este momento es el siguiente:
Desde aquí podemos ver que los datos 4 de Fuente1 se han calculado dos veces. Por lo tanto, bajo la semántica Exactamente una vez, las barreras deben estar alineadas, mientras que bajo la semántica Al menos una vez, las barreras pueden no estar alineadas.
Nota: La alineación de barreras solo ocurrirá en operadores de muchos a uno (como unión) o operadores de uno a muchos (como reparación/barajado). Si se trata de un operador uno a uno, como mapa, mapa plano o filtro, etc., no existe el concepto de alineación y se implementará la semántica Exactamente una vez, incluso si Al menos una vez está configurado en el programa.
6. Procesar datos almacenados en caché
Cuando una tarea recibe todas las barreras enviadas desde arriba, se puede considerar que la tarea actual ha recibido todos los datos de este punto de control. Luego, la tarea continuará enviando la barrera hacia abajo y luego procesará los datos almacenados en caché. Por ejemplo, aquí sum_even procesará los datos enviados por Source1 4. Además, durante este proceso, Source continuará leyendo los datos y. enviarlo aguas abajo sin interrupción.
7. Informar de la finalización del punto de control
Cuando el receptor recibe la barrera, informará la finalización del punto de control al JobManager. En este punto, este punto de control finaliza y el estado de cada etapa se conserva y se puede utilizar para la recuperación de fallas posteriores.