Flink State 扩容重新分配

参考学习博客然后写的学习笔记:

  • KeyedState - 这里面的key是我们在SQL语句中对应的GroupBy/PartitioneBy里面的字段,key的值就是groupby/PartitionBy字段组成的Row的字节数组,每一个key都有一个属于自己的State,key与key之间的State是不可见的;
  • OperatorState - Apache Flink内部的Source Connector的实现中就会用OperatorState来记录source数据读取的offset。

OperatorState并行度改变时比较简单,如上面保存kafka offset的例子。

OperatorState采用了List的数据结构的设计,在改变并发时,通过取模的方式分配分区。新增分区的offset需要远程拉取。

KeyedState并发度改变,因为KeyedState保存的状态往往挺大的,不在使用OperatorState并行度改变的方法。可以看出每次修改并行度如果按照取模的算法,对算子状态就是灾难。大量的算子无法在使用原本本地的状态,只能从远程拉取状态进行同步。OperatorState的算法是先以maxParallelism为标准

1.hash(key)%maxParallelism   ->key-group  利用key的hash值对maxParallelism取模,分配key到对应的key-group上

2.key-group/真正的并发度得到平均值 将余数平分给task编号靠前的算子  ->得到每个task上面的key-group数量

3.每个task顺序的取到自己的key-group

从图中可以看出大部分算子还是落到了本地。

可以看出所有的前提都是基于maxParallelism,如果maxParallelism发生改变会导致key-group重新分组,最后每个task上的key-group都会改变。这样对状态本地化改动比较大。所以在Flink中maxParallelism默认为4096.

努力吧,皮卡丘

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值