state是什么意思(Flink中的State概念及其扩容算法)( 二 )
Flink的DAG图中只有边相连的节点有网络通信,也就整个DAG在垂直方向有网络IO,在水平方向如下图的stateful节点之间没有网络通信,这种模型也保证了每个operator实例维护一份自己的state,并且保存在本地磁盘(远程异步同步) 。通过这种设计,任务的所有状态数据都是本地的,并且状态访问不需要任务之间的网络通信 。避免这种流量对于像Flink这样的大规模并行分布式系统的可扩展性至关重要 。
如上我们知道Flink中State有OperatorState和KeyedState,那么在进行扩容时候(增加并发)State如何分配呢?比如:外部Source有5个partition,在Flink上面由Source的1个并发扩容到2个并发,中间Stateful Operation 节点由2个并发并扩容的3个并发,如下图所示:
文章图片
在Flink中对不同类型的State有不同的扩容方法,接下来我们分别介绍 。
OperatorState对扩容的处理我们选取Flink中某个具体Connector实现实例进行介绍,以MetaQ为例,MetaQ以topic方式订阅数据,每个topic会有N>0个分区,以上图为例,假设我们订阅的MetaQ的topic有5个分区,那么当我们source由1个并发调整为2个并发时候,State是怎么恢复的呢?
State 恢复的方式与Source中OperatorState的存储结构有必然关系,我们先看MetaQSource的实现是如何存储State的 。首先MetaQSource 实现了ListCheckpointed<T extends Serializable>,其中的T是Tuple2<InputSplit,Long>,我们在看ListCheckpointed接口的内部定义如下:
public interface ListCheckpointed<T extends Serializable> { List<T> snapshotState(long var1, long var3) throws Exception; void restoreState(List<T> var1) throws Exception;}我们发现 snapshotState方法的返回值是一个List<T>,T是Tuple2<InputSplit,Long>,也就是snapshotState方法返回List<Tuple2<InputSplit,Long>>,这个类型说明state的存储是一个包含partiton和offset信息的列表,InputSplit代表一个分区,Long代表当前partition读取的offset 。InputSplit有一个方法如下:
public interface InputSplit extends Serializable { int getSplitNumber();}也就是说,InputSplit我们可以理解为是一个Partition索引,有了这个数据结构我们在看看上面图所示的case是如何工作的?当Source的并行度是1的时候,所有打partition数据都在同一个线程中读取,所有partition的state也在同一个state中维护,State存储信息格式如下:
文章图片
【state是什么意思(Flink中的State概念及其扩容算法)】
- 大家都在刷“张同学”,到底刷的是什么?
- 从放烟花到弹钢琴,疫情防控的“温情”背后是什么
- 动解|元宇宙,几个意思?
- 殷世航和韩安冉的关系怎么样 连麦是什么时候
- 我慢慢的听雪落下的声音是什么歌 《延禧攻略》插曲及片尾曲
- 萌德卡妹宣布分手 萌德卡妹为何分手是什么时候交往的
- 芈月传芈瑶第几集出现 芈瑶最后的结局是什么
- 何炅谢娜是什么关系 何炅的父亲何畏为什么被叫老赖
- 白百何为什么叫京圈太子妃 白百何和文章是什么关系
- 闪光的乐队是什么类型的综艺 闪光的乐队嘉宾阵容有谁