flink
state
场景
- 有状态的逻辑是因为数据之间存在关联,单条数据是没有办法把所有的信息给表现出来。
- 去重
- 窗口计算
- 机器学习参数
- 访问历史数据
- 有状态的逻辑是因为数据之间存在关联,单条数据是没有办法把所有的信息给表现出来。
为什么要管理状态
- 内存
- 流式作业:24 小时的数据都放到内存,可能会出现内存不足。
- 高可用
- 机器若出现故障或者宕机,需要考虑如何备份及从备份中去恢复,
- 扩展性
- 单节点无法处理全部访问数据,增加几个节点进行横向扩展,这时数据的状态如何平均分配到新增加的节点。
- 内存
方案
Managed State & Raw State
- 自定义operator用 raw
- raw 必须能够转成字节数组
- managed,flink自动存储和恢复,并进行内存优化
支持已知的数据结构,如 Value、List、Map
Managed State
Keyed State
每个 Key 对应一个 State
整个程序中没有 keyBy 的过程就没有办法使用KeyedStream。
并发改变时状态重新分配:内置了 2 种分配方式
Keyed State 通过 RuntimeContext 访问,这需要 Operator 是一个 Rich Function。
几种 Keyed State 的差异
ReducingState 和 AggregatingState 与 ListState 都是同一个父类,但状态数据类型上是单个值
AggregatingState 输入的 IN,输出的是 OUT。
Operator State
- 可以用于所有算子,常用于 Source
- 一个 Operator 实例对应一个 State
- Operator State 需要自己实现 CheckpointedFunction 或 ListCheckpointed 接口。
- 支持的数据结构相对较少
使用示例
实现的是:首先下订单,订单生成后状态为待付款,当再来一个事件状态付款成功,则事件的状态将会从待付款变为已付款,待发货…
状态的保存和恢复
保存
- Checkpoint 会定时制作分布式快照
恢复
checkpoint
- 数据源需要支持数据重新发送
- 两种一致性语义,一种是恰好一次,一种是至少一次
- 1、把进程或者线程移到 active 的 其他台机器上
2、整个作业的所有 Task 都回滚到最后一次成功 Checkpoint 中的状态
savepoint
- 手动调整并发,必须要重启作业并会提示 Checkpoint 已经不存在–> 此时savepoint
- 比较持久,以标准格式存储
- 允许代码或配置发生改变,恢复需要启动作业手动指定一个路径恢复
checkpoint实现
- 运行环境 env.enableCheckpointing 传入间隔时间。越频繁,恢复时追数据就会相对减少,IO 消耗增加。
- 设置了 Exactly_Once 语义,并且需要 Barries 对齐,这样可以保证消息不会丢失也不会重复。
- setMinPauseBetweenCheckpoints 防止 Checkpoint 太过于频繁
- setCheckpointTimeout 表示做 Checkpoint 多久超时
- setMaxConcurrentCheckpoints
- enableExternalizedCheckpoints。默认 Checkpoint 会在整个作业 Cancel 时被删除。Checkpoint 是作业级别的保存点。
checkpoint可选的状态存储方式
MemoryStateBackend
- 构造方法是设置最大的 StateSize,选择是否做异步快照
- 且需要注意 maxStateSize <= akka.framesize 默认 10 M
- Checkpoint 存储在 JobManager 内存中,因此总大小不超过 JobManager 的内存。- 本地测试、几乎无状态的作业,比如 ETL、JobManager 不容易挂,或挂掉影响不大的情况。不推荐在生产场景使用。
FsStateBackend
- 需要传一个文件路径和是否异步快照
- State 依然在 TaskManager 内存中- Checkpoint 存储在外部文件系统(本地或 HDFS)
- 常规使用状态的作业、例如分钟级窗口聚合或 join、需要开启 HA 的作业。
RocksDBStateBackend
- key/value 的内存存储系统
- 不支持同步的 Checkpoint
- 支持增量的 Checkpoint
- 存储在外部文件系统(本地或 HDFS)
- 单个 TaskManager 上 State 总量不超过它的内存+磁盘,单 Key 最大 2G,总大小不超过配置的文件系统容量即可
- 超大状态的作业,例如天级窗口聚合、需要开启 HA 的作业、最好是对状态读写性能要求不高的作业。
窗口
- todo
watermark
- todo
部署
- todo
CET
- todo
概念&角色
- TaskManager & slot
- 每一个 TaskManager 都是一个JVM进程
- 每个task slot表示TaskManager拥有资源的一个固定大小的子集
- 将其管理的内存均分给各个slot
- 一个TaskManager一个slot时,那么每个task group运行在独立的JVM中
- 多个slot时,多个subtask可以共同享有一个JVM
- 在同一个JVM进程中的task将共享TCP连接和心跳消息,也可能共享数据集和数据结构,从而减少每个task的负载。
- todo
reference
本文链接: https://satyrswang.github.io/2021/03/08/flink/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!