前提:
当Flink左右从checkpoint恢复,或者从savepoint中重启的时候,就回涉及到状态的重新分配,尤其是当并行度发生改变的时候。
本文只是说了Operator State和Key State恢复时的策略。如果只是想要使用,那么可以移步笔者的另一篇文章 :
Flink SavePoint(checkpoint)的使用与从中恢复
Operator State Redistribute
当operator改变并行度的时候(Rescale),会触发状态的Redistribute,即Operator State里的数据会重新分配到Operator的Task实例。这里有三种方式,举例说明平行度由3改为2
这个是普通的ListState, 原先所有State中的元素均匀划分给新的Task
这个是UnionList State,所有的State中的元素全部分配给新的Task
还有一张是BroadState State,所有Task上的State都是一样的,新的Task获得State的一个备份。
选择方式:
由于是operate state所以只能在operate中使用,并且由于是state从checkpoint中的重分配,所以对应的类必须实现CheckpointedFunction接口。如下图方式应用,这样就会初始化ListState了,就可以不用在open方法里初始化了。
Keyed State Redistribute
对于Keyed State就比较好处理了,对应的Key被Redistribute到哪个task,对应的keyed state就被Redistribute到哪个Task
Keyed state redistribute是基于Key Group来做分配的:
- 将key分为group
- 每个key分配到唯一的group
- 将group分配给task实例
- Keygroup由最大并行度的大小所决定
Keyed State最终被分配到哪个Task,需要经过一下三个步骤:
- hash = hash(key)
- KeyGroup = hash%numOfKeyGroups
- SubTask=KeyGroup*parallelism/numOfKeyGroups