Flink - 状态后端

目录

7.4.1 状态后端的分类

7.4.2 如何选择正确的状态后端

7.4.3 状态后端的配置

1. 配置默认的状态后端

2. 为每个作业(Per-job)单独配置状态后端


Flink是一个stateful(带状态)的数据处理系统;系统在处理数据的过程中,各算子所记录的状态会随着数据的处理而不断变化;

一旦系统崩溃,需要重启后能够恢复出崩溃前的状态才能进行数据的接续处理;因此,必须要一种机制能对系统内的各种状态进行持久化容错;[checkpoint是实现状态数据的持久化触发 , 状态后端负责数据的维护存储]

在flink中,状态的存储、访问以及维护,都是由一个可插拔的组件决定的,这个组件就叫做状态后端(state backend).状态后端主要负责管理本地状态的存储方式和位置。 

7.4.1 状态后端的分类

状态后端是一个"开箱即用"的组件,可以在不改变应用程序逻辑的情况下独立配置。

Flink中提供了两类不同的状态后端,一种是“哈希表状态后端”(HashMapStateBackend).

另一种是"内嵌RocksDB状态后端”(EmbeddedRocksDBStateBackend).如果没有特别配置,系统默认的状态后端是HashMapStateBackend.

(1)哈希表状态后端(HashMapStateBackend)

HashMapStateBackend是把状态存放在内存里。具体实现上,哈希表状态后端在内部会直接把状态当作对象(Objects),保存在TaskManager的JVM堆上。普通的状态,以及窗口中收集的数据和触发器,都会以键值对的形式存储起来,所以底层是一个哈希表(HashMap),这种状态后端也因此得名。

(2)内嵌RocksDB状态后端(EmbeddedRocksDBStateBackend)

RocksDB是一种内嵌的key-value存储介质,可以把数据持久化到本地磁盘。配置EmbeddRocksDBStateBackend后,会讲处理中的数据全部放入RocksDB数据库中,RocksDB默认存储在TaskManager的本地数据目录中

RocksDB的状态数据被存储为序列化的字节数组,读写操作需要序列化/反序列化,因为状态的访问性能要差一些。另外,因为做了序列化,key的比较也会按照字节进行,而不是直接调用.hashCode()和.equals()方法。

EmbeddedRocksDBStateBackend始终执行的是异步快照,所以不会因为保存见擦点而阻塞数据的处理;而且它还提供了增量式保存检查点的机制,这在很多情况下可以大大提升保存效率。

注意:上述2种状态后端,在生成checkpoint快照文件时,生成的文件格式是完全一致的;

所以,用户的flink程序在更改状态后端后,重启时依然可以加载和恢复此前的快照文件数据;

7.4.2 如何选择正确的状态后端

HashMap和RocksDB两种状态后端最大的区别,就在于本地状态存放在哪里。

HashMapStateBackend是内存计算,读写速度非常快;但是,状态的大小会受到集群可用内存的限制,如果应用的状态随着事件不停的增长,就会耗尽内存资源。

而RocksDB是硬盘存储,所以可以根据可用的磁盘空间进行扩展,所以它非常适合于超级海量状态的存储。不过由于每个状态的读写都需要做序列化/反序列化,而且可能需要直接从磁盘读取数据,这就会导致性能的降低,平均读写性能要比HashMapStateBackend满一个数量级。

7.4.3 状态后端的配置

在不做配置的时候,应用程序使用的默认状态后端是由集群配置文件flink-conf.yaml中指定的,配置的键名称为state.backend.这个默认配置对集群上运行的所有作业都有效,我们可以通过更改配置值来改变默认的状态后端。另外,我们还可以在代码中为当前作业单独配置状态后端,这个配置会覆盖掉集群配置文件的默认值。

1. 配置默认的状态后端

在flink-conf.yaml中,可以使用state.backend来配置默认状态后端。

配置项的可能值为hashmap,这样配置的就是HashMapStateBackend:如果配置项的值是rocksdb,这样配置的就是EmbeddedRocksDBSateBackend.

下面是一个配置HashMapStateBackend的例子:

# 默认状态后端
state.backend:hashmap
# 存放检查点的文件路径
state.checkpoints.dir:hdfs://hadoop102:8020/flink/checkpoints

这里的state.checkpoints.dir配置项,定义了检查点和元数据写入的目录

2. 为每个作业(Per-job)单独配置状态后端

通过执行环境设置,HashMapStateBackend.

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(new HashMapStateBackend());

通过执行环境设置,EmbeddRocksDBStateBackend.

StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(new EmbeddRocksDBStateBackend());

需要注意,如果想在IDE中使用EmbeddedRocksDBStateBackend,需要为flink项目添加依赖。

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-statebackend-rocksdb</artifactId>
    <version>1.15.1</version>
    <scope>provided</scope>
</dependency>

  • 19
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值