Flink状态后端 State Backend

什么是状态?

无状态计算指的是数据进入Flink后经过算子时只需要对当前数据进行处理就能得到想要的结果,有状态计算就是需要和历史的一些状态或进行相关操作,才能计算出正确的结果
状态的使用场景:

  1. 去重:需要记录哪些数据出现过,哪些没出现过,记录所有主键
  2. 窗口计算,已进入未触发计算的数据比如计算一个小时的counter
  3. 机器学习/深度学习:训练模型及参数
  4. 访问历史数据:需要与昨天的数据进行对比,历史数据放在状态里

状态管理和备份

为什么要管理状态?

管理状态最直接的方式就是将数据都放到内存中,也是最常用的方式,但对于流式作业有要求:
流式作业的特点是7*24小时运行,数据不重复消费,不丢失,保证只计算一次,数据实时产出不延迟.
但是当状态很大,内存容量限制,或者实例运行奔溃,或需要扩展并发度等情况下,放在内存就不再合适.

状态的保存及恢复(容错机制)

Flink状态保存主要依靠Checkpoint机制,Checkpoint机制会定时制作分布式快照,对程序中的状态进行备份.

Checkpoint

  1. 定时制作分布式快照,对程序中的状态进行备份;
  2. 发生故障时:将整个作业的所有task都回滚到最后一次成功checkpoint中的状态,然后从那个点开始继续处理;
  3. 必要条件:数据源支持重发
  4. 一致性语义:恰好一次,至少一次

Checkpoint 的存储的位置取决于配置的 State backend(JobManager 内存,文件系统,数据库…)。
默认情况下,State 存储在 TaskManager 内存中,Checkpoint 存储在 JobManager 内存中。Flink 支持在其他 state backend 中存储 State 和 Checkpoint。可以通过如下方法配置:StreamExecutionEnvironment.setStateBackend(…)
Flink 提供了不同的 State backend,支持不同的 State 存储方式和位置。
默认会使用配置文件 flink-conf.yaml 指定的选项,也可以在每个作业中设置来覆盖默认选项:
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(…);
Flink 自带了以下几种开箱即用的 state backend:
MemoryStateBackend
FsStateBackend
RocksDBStateBackend
在没有配置的情况下,系统默认使用 MemoryStateBackend。

比较

尽管有checkpoint保证exactly-once,但对于实时性要求高的业务场景,每次重启所消耗的时间都可能会导致业务不可用。也许你也经常遇到这样的情况,checkpoint又失败了?连续失败?task manager 内存爆了? 这些情况都很容易导致Flink任务down了,这时候需要思考下你所处的业务场景下,选用的Flink State Backends是否合理?
对三种状态后端的介绍:
MemoryStateBackend 默认,小状态,本地调试使用
FsStateBackend 大状态,长窗口,高可用场景
RocksDBStateBackend 超大状态,长窗口,高可用场景,可增量checkpoint

可选方式存储方式容量限制使用场景
MemoryStateBackendstate存在tm内存中,checkpoint存在jm中单个state默认5M,总大小不超过jm内存,可以在构造函数中传参调大本地测试,不推荐生产
FsStateBackendstate存内存,checkpoint存在外部存储如hdfsstate总量不要超过tm内存,总量不超过外存磁盘大小常规任务,分钟,join,需要开启ha的任务,可在生产使用
RocksDbBackendstate存在tm上的kv数据库中(内存+磁盘) ,checkpoint存在外部存储如hdfs单个key最大2G ,state总量不要超过tm内存,总量不超过外存磁盘大小超大作业,天级窗口,最好对读写性能要求不高的作业
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值