Flink StateBackend 状态后端示例

232 阅读5分钟

状态管理地址:Flink 状态管理\

文章目录

一.简介

Flink提供三种可用的状态后端:MemoryStateBackend,FsStateBackend,和RocksDBStateBackend。

场景

MemoryStateBackend:

  • 本地开发或调试。
  • 小状态场景。

FsStateBackend:

  • 大状态,长窗口或大键值状态。
  • 高可用场景。

RocksDBStateBackend:

  • 大状态,长窗口或大键值状态。
  • 高可用场景。
  • 增量checkpoint,超大状态。

设置

如果没有明确指定,将使用 jobmanager 做为默认的 state backend。你能在 flink-conf.yaml 中为所有 Job 设置其他默认的 State Backend。 每一个 Job 的 state backend 配置会覆盖默认的 state backend 配置。

二.MemoryStateBackend

MemoryStateBackend 是将状态维护在Java堆上的一个内部状态后端。键值状态和窗口算子使用哈希表来存储数据(values)和定时器(timers)。当应用程序 checkpoint 时,此后端会在将状态发给 JobManager 之前快照下状态,JobManager 也将状态存储在 Java 堆上。默认情况下,MemoryStateBackend 配置成支持异步快照。异步快照可以避免阻塞数据流的处理,从而避免反压的发生。

注意点

  • 默认情况,每一个独立状态大小限制是5MB。在MemoryStateBackend 的构造器中可以增加其大小。
  • 状态大小受到 akka 帧大小的限制,所以无论怎么调整状态大小配置,都不能大于 akka 的帧大小。也可以通过 akka.framesize 调整 akka 帧大小(通过配置文档了解更多)。
  • 状态的总大小不能超过 JobManager 的内存。

场景

  • 本地开发或调试时建议使用 MemoryStateBackend,因为这种场景的状态大小的是有限的。
  • MemoryStateBackend 最适合小状态的应用场景。例如 Kafka consumer,或者一次仅一记录的函数 (Map, FlatMap,或 Filter)。

三.FsStateBackend

FsStateBackend 需要配置一个文件系统的 URL(类型、地址、路径),例如:”hdfs://namenode:40010/flink/checkpoints” 或 “[file:///data/flink/checkpoints](file:///data/flink/checkpoints)”。

当选择使用FsStateBackend时,正在进行数据会被存储TaskManager内存中。在checkpoint时,此后端会将状态快照写入配置的文件系统和目录的文件中,同时会在JobManager的内存中

(在高可用场景下会存在 Zookeeper 中)存储极少的元数据。

默认情况下,FsStateBackend 配置成提供异步快照,以避免在状态 checkpoint 时阻塞数据流的处理。该特性可以实例化 FsStateBackend 时传入 false 的布尔标志来禁用掉,例如:

new FsStateBackend(path, false);

注意

  • 当前状态仍然会存在TaskManager中,所以状态的大小不能超过TaskManager内存。

场景

  • FsStateBackend 适用于处理大状态,长窗口,或大键值状态的有状态处理任务。
  • FsStateBackend 非常适合用于高可用方案。

四.RocksDBStateBackend

RocksDBStateBackend 的配置也需要一个文件系统(类型,地址,路径),如下所示:

  • “hdfs://namenode:40010/flink/checkpoints” 或
  • “s3://flink/checkpoints”

RocksDB 是一种嵌入式的本地数据库。RocksDBStateBackend 将处理中的数据使用 RocksDB 存储在本地磁盘上。在 checkpoint 时,整个 RocksDB 数据库会被存储到配置的文件系统中,或者在超大状态作业时可以将增量的数据存储到配置的文件系统中。

同时 Flink 会将极少的元数据存储在 JobManager 的内存中,或者在 Zookeeper 中(对于高可用的情况)。RocksDB 默认也是配置成异步快照的模式。

注意

  • RocksDB 支持的单 key 和单 value 的大小最大为每个 2^31 字节。这是因为 RocksDB 的 JNI API 是基于 byte[] 的。
  • 我们需要强调的是,对于使用具有合并操作的状态的应用程序,例如 ListState,随着时间可能会累积到超过 2^31 字节大小,这将会导致在接下来的查询中失败。

场景

  • RocksDBStateBackend 最适合用于处理大状态,长窗口,或大键值状态的有状态处理任务。
  • RocksDBStateBackend 是目前唯一支持增量 checkpoint 的后端。增量 checkpoint 非常使用于超大状态的场景。
  • RocksDBStateBackend 非常适合用于高可用方案。

当使用RocksDB 时,状态大小只受限于磁盘可用空间的大小,这也使得 RocksDBStateBackend 成为管理超大状态的最佳选择。使用 RocksDB 的权衡点在于所有的状态相关的操作都需要序列化(或反序列化)才能跨越 JNI 边界。与上面提到的堆上后端相比,这可能会影响应用程序的吞吐量。

五.设置

如果没有明确指定,将使用 jobmanager 做为默认的 state backend。你能在 flink-conf.yaml 中为所有 Job 设置其他默认的 State Backend。 每一个 Job 的 state backend 配置会覆盖默认的 state backend 配置。

设置每个Job的State Backend

StreamExecutionEnvironment 可以对每个 Job 的 State Backend 进行设置

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(new FsStateBackend("hdfs://namenode:40010/flink/checkpoints"));

RocksDBStateBackend:

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-statebackend-rocksdb_2.11</artifactId>
    <version>1.11.0</version>
    <scope>provided</scope>
</dependency>

由于 RocksDB 是 Flink 默认分发包的一部分,所以如果你没在代码中使用 RocksDB,则不需要添加此依赖。而且可以在 flink-conf.yaml 文件中通过 state.backend 配置 State Backend。

设置默认的(全局)State Backend

在 flink-conf.yaml 可以通过键 state.backend 设置默认的 State Backend。

可选值包括 jobmanager (MemoryStateBackend)、filesystem (FsStateBackend)、rocksdb (RocksDBStateBackend),或使用实现了 state backend 工厂 StateBackendFactory 的类的全限定类名,例如: RocksDBStateBackend 对应为 org.apache.flink.contrib.streaming.state.RocksDBStateBackendFactory。

state.checkpoints.dir 选项指定了所有 State Backend 写 CheckPoint 数据和写元数据文件的目录。

# 用于存储 operator state 快照的 State Backend
state.backend: filesystem
# 存储快照的目录
state.checkpoints.dir: hdfs://namenode:40010/flink/checkpoints

参考

www.bookstack.cn/read/flink-…

公众号

在这里插入图片描述
名称:大数据计算
微信号:bigdata_limeng