【偏理论】Flink1.11 状态后端说明及部分源码阅读

状态后端类型

状态后端是什么?用于存储flink应用状态的结构。我们都知道Flink有很多有状态的算子,这些算子的状态需要有地方进行存储,状态后端就是用于存储状态的结构。flink运行过程中产生的检查点也被保存在状态后端当中。(这句好像不对,状态会以检查点为单位进行保存,检查点会保存在状态后端当中)

Flink1.11中共支持3中类型的状态后端:

  • MemoryStateBackend:适合本地测试和状态本身很小的情况下使用
  • FsStateBackend:适合大状态,长窗口和大的key/value状态
  • RocksDBStateBackend:适合大状态,长窗口和大的key/value状态(与文件系统状态后端相同)

MemoryStateBackend

创建一个内存状态后端可以用new MemoryStateBackend();默认最大状态大小为5M,异步快照。具体有下图中的四个构造方法。

FsStateBackend

文件系统状态后端可以是本地文件系统也可以是hdfs这样的分布式文件系统,创建文件系统状态后端同样很简单:

privat final String stateBackendUri = "hdfs://localhost:8020/flink/statebackend";
FsStateBackend fsStateBackend = new FsStateBackend(stateBackendUri);

该后端有N多种构造函数(如下图),但是总共只有两个构造参数1)文件系统路径,2)是否执行异步快照(默认异步快照)。异步快照可以避免写入状态检查点时影响flink程序的执行。

RocksDBStateBackend

RocksDBStateBackend本身是FLink内置的一种状态后端,但是开发时需要引入额外的依赖。flink服务的lib文件夹下面有所以不需要将其打包进代码。是介于内存状态后端和文件系统状态后端的一种状态后端。他可以将状态保存在内存中,当触发一次检查点时才会将其checkpoint到文件系统中。

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

他可以指定一个文件系统路径进行构建,也可以指定一个文件系统状态后端进行构建,如下图。下图中还有一个布尔参数,表示是否启用增量检查点,默认不启用。该状态后端是唯一支持增量检查点的状态后端。

有关增量检查点的利弊可以参考这篇文章

配置状态后端

很简单创建Flink运行环境然后在环境基础上设置对应类型的状态后端即可。

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

三种状态后端的利弊

内存状态后端就不说了,适合开发,不太适合生产环境。

文件系统状态后端和RocksDB状态后端第一节介绍的时候适合的场景相同,那使用的时候该如何选择呢?

  • 受JNI限制,RocksDB状态后端存储的每个键或者值大小上下是2的31次方字节,也就是20G。
  • 比起文件系统状态后端,RocksDB状态后端可以存放更多的状态在内存中,同时也意味着RocksDB状态后端的吞吐量会比文件系统小
  • RocksDB状态后端所有的读写操作都需要经过序列化的反序列化,这种操作代价是很昂贵的
  • 但是RocksBD状态后端支持增量检查点操作,是其他两种后端不支持的。

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值