flink1.12.x 容错机制:State Backends状态后端-MemoryStateBackend、FsStateBackend、RocksDBStateBackend

说明

当使用 checkpoint 时,状态(state)会被持久化,以防止数据的丢失并确保发生故障时能够完全恢复。

状态是通过什么方式持久化,取决于使用的 状态后端

状态后端 主要负责两件事:

  • Local State Management(本地状态管理)
  • Remote State Checkpointing(远程状态备份)

可用的状态后端

  • MemoryStateBackend,默认

  • FsStateBackend

  • RocksDBStateBackend

注意:如果什么都不配置,系统默认的是MemoryStateBackend

MemoryStateBackend

直接将State对象存储到TaskManager的JVM堆上

缺点

  • 每一个状态的大小限制为 5 MB

  • 聚合的状态必须能够在JobManager内存中存放下,即:状态的总大小不能超过 JobManager 的内存

  • 生产环境中几乎不用

应用场景

  • 本地测试、几乎无状态的作业,比如 ETL、JobManager 不容易挂,或挂掉影响不大的情况。

  • 不推荐在生产场景使用。

FsStateBackend(推荐)

在 checkpoint 时,将状态快照写入配置的文件系统中,如:HDFS

  • hdfs路径:

    hdfs://namenode:8020/flink/checkpoint
    
  • 本地文件系统路径:

    file:///D:/flink/checkpoints
    

缺点

状态先会存在 TaskManager 中,所以状态的大小不能超过 TaskManager 的内存,以免发生OOM。

应用场景

  • 处理大状态,长窗口,或大键值状态的有状态处理任务, 例如分钟级窗口聚合或 join。
  • 适合用于高可用方案(需要开启HA的作业)。
  • 可以在生产环境中使用

RocksDBStateBackend(推荐)

主要是文件系统,如 HDFS

  1. 状态存储在 RocksDB 数据库
  2. 在 checkpoint 时,整个 RocksDB 数据库会被存储到配置的文件系统中,如:HDFS

RocksDB

RocksDB 是一种 嵌入式 ,key/value 数据库。先将状态放到内存中,如果内存快满时,则写入到磁盘中

注意:

  • RocksDB不支持同步的 Checkpoint
  • RocksDB支持增量的 Checkpoint

缺点

RocksDB支持的单key和单value的大小最大为每个 2^31 字节,即:2G。

对于使用具有合并操作的状态的应用程序,例如 ListState,随着时间可能会累积到超过 2^31 字节大小,这将会导致在接下来的查询中失败。

性能差一些,状态会存储在硬盘上

应用场景

  • 最适合用于处理超大状态,长窗口,或大键值状态的有状态处理任务,例如天级别窗口聚合。
  • 非常适合用于高可用方案。
  • 最好是对状态读写性能要求不高的作业

依赖

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-statebackend-rocksdb_2.12</artifactId>
    <version>1.12.0</version>
</dependency>

选择

RocksDBStateBackend直接将State存储到RocksDB数据库中,所以 不受JobManager的内存限制,但会有 读写延迟

同时 RocksDBStateBackend 支持增量备份,如果不是对延迟有极高的要求,RocksDBStateBackend是更好的选择


原文出处:/show_1IX229AL20SP.html