登录    关于
马育民老师的博客

马育民的博客

QQ:65242847

flink1.12.x 容错机制:状态后端(State Backends)

说明

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

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

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

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

可用的状态后端

  • MemoryStateBackend,默认

  • FsStateBackend

  • RocksDBStateBackend

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

MemoryStateBackend

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

缺点

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

  • 状态的总大小不能超过 JobManager 的内存

  • 生成环境中几乎不用

应用场景

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

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

FsStateBackend

主要是文件系统,如:HDFS

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

缺点

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

  • 状态的总大小不能超过 JobManager 的内存

应用场景

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

RocksDBStateBackend(推荐)

主要是文件系统,如 HDFS

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

RocksDB

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

注意: RocksDB不支持同步的 Checkpoint

RocksDB支持增量的 Checkpoint

缺点

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

对于使用具有合并操作的状态的应用程序,例如 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是更好的选择


原文出处:https://malaoshi.top/show_1IX229AL20SP.html