Flink 从checkpoint恢复,并行度改变后,状态重分配

前提:

当Flink左右从checkpoint恢复,或者从savepoint中重启的时候,就回涉及到状态的重新分配,尤其是当并行度发生改变的时候。

本文只是说了Operator State和Key State恢复时的策略。如果只是想要使用,那么可以移步笔者的另一篇文章 :

Flink SavePoint(checkpoint)的使用与从中恢复

 

Operator State Redistribute

当operator改变并行度的时候(Rescale),会触发状态的Redistribute,即Operator State里的数据会重新分配到Operator的Task实例。这里有三种方式,举例说明平行度由3改为2

Flink 从checkpoint恢复,并行度改变后,状态重分配_第1张图片

这个是普通的ListState, 原先所有State中的元素均匀划分给新的Task

Flink 从checkpoint恢复,并行度改变后,状态重分配_第2张图片

这个是UnionList State,所有的State中的元素全部分配给新的Task

Flink 从checkpoint恢复,并行度改变后,状态重分配_第3张图片

还有一张是BroadState State,所有Task上的State都是一样的,新的Task获得State的一个备份。

选择方式:

由于是operate state所以只能在operate中使用,并且由于是state从checkpoint中的重分配,所以对应的类必须实现CheckpointedFunction接口。如下图方式应用,这样就会初始化ListState了,就可以不用在open方法里初始化了。

Flink 从checkpoint恢复,并行度改变后,状态重分配_第4张图片

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,需要经过一下三个步骤:

  1. hash = hash(key)
  2. KeyGroup = hash%numOfKeyGroups
  3. SubTask=KeyGroup*parallelism/numOfKeyGroups

 

你可能感兴趣的:(flink)