Red de conocimiento informático - Problemas con los teléfonos móviles - [Estado de Flink] ¿Dónde se guarda el estado?

[Estado de Flink] ¿Dónde se guarda el estado?

Analice el proceso de guardar el estado desde el código fuente. El artículo anterior explicó el proceso de guardar el estado de las tareas y operadores. Al final, el operador llama al método de instantánea para realizar la instantánea del estado. operación. Entonces, ¿dónde se salva el Estado?

lt;1gt;Introducción al State Backend

Acerca del almacenamiento de bytes sin procesar y los backends

Resumen: StateBackend se utiliza principalmente para el almacenamiento de bytes sin procesar (es decir, Checkpoint ), estado con clave y estado del operador, donde los datos del punto de control se almacenan a través de CheckpointStreamFactory, el estado con clave lo proporciona AbstractKeyedStateBackend y el estado del operador lo proporciona OperadorStateBackend.

lt; 2gt;

El constructor de RocksDBStateBackend puede pasar un AbstractStateBackend; de lo contrario, se utiliza FsStateBackend de forma predeterminada.

Como puede ver, desde la perspectiva de OperatorState, Flink actualmente tiene solo una implementación, DefaultOperatorStateBackend, que recibe un estado de estilo Lista en la memoria.

Desde la perspectiva de KeyedState, actualmente existen dos implementaciones: HeapKeyedStateBackend guarda el estado en la memoria, mientras que RocksDbKeyedStateBackend guarda el estado en el RocksDB local de la TM. En términos relativos, el primero es muy rápido y eficiente en la memoria, pero por un lado limitará el tamaño del estado y, por otro lado, también provocará problemas de memoria en la propia JVM; el segundo implicará problemas de memoria en los archivos locales; serialización y deserialización, la eficiencia no es tan buena como la primera, pero el tamaño del estado que se puede guardar será grande.

Desde la perspectiva de los puntos de control y los puntos de guardado, el método de fábrica de memoria se almacena en la memoria y obviamente no se puede utilizar en un entorno de producción, mientras que el método de fábrica Fs y el método de fábrica RocksDb se colocan de manera uniforme en el sistema de archivos. Por ejemplo HDFS.

Como se puede ver en las líneas 3 y 4 de la figura anterior, hay tres tipos de HeapState que se utilizan para almacenar el estado.

Como se puede ver en las líneas 3 y 4 de la figura anterior, hay tres tipos de estados:

DefaultOperatorStateBackend

Los métodos de fábrica DefaultDb se colocan todos en archivos en el sistema. strong>

(1)

La clase de implementación ListSate del operador PartitionableListState y OperadorState se almacenan en la memoria y siguen siendo esencialmente un ArrayList.

(2) El método Snapshot

snapshotStrategy es AbstractSnapshotStrategylt; OperadorStateHandlegt; y AbstractSnapshotStrategy tiene tres clases de implementación:

Método Snapshot en DefaultOperatorStateBackendSnapshotStrategy:

El método de instantánea se dirige principalmente a registradosOperatorStates y registradosBroadcastStates

El primer paso:

Realice una copia profunda en todos los estados registrados para evitar que la estructura de datos se modifique nuevamente durante el proceso de Checkpoint. , deepCopy en realidad Lo anterior se realiza a través del proceso de serialización y deserialización

El segundo paso:

Para escribir State y MetaInfo de forma asincrónica, primero cree un CheckpointStateOutputStream llamando al método createCheckpointStateOutputStream de la fábrica. ¿Qué tipo de fábrica es? Esto depende del estado del backend definido. Luego se devuelve el operadorstateHandle correspondiente para que lo utilice el proceso de restauración.

Paso 3:

Cuando StreamTask activa un punto de control, activará una instantánea de todos los operadores en la tarea. La parte de activación son los pasos 1 y 2 anteriores, de los cuales el segundo. El paso es Devuelve un RunnableFuture. Después de la activación, enviará una tarea asincrónica AsyncSnapshotCallable y se bloqueará hasta el punto de control Future. De hecho, llama a este método AbstractAsyncIOCallable hasta que se completa y devuelve un OperadorStateHandle. . Esta ubicación es diferente del identificador keyedState que se devuelve más adelante.