大厂面试:上游每秒处理百万条数据,下游如何避免数据倾斜?

发表时间: 2023-10-27 20:44

熟悉flink分区策略的小伙伴应该都非常清楚。flink分区策略包含8种,具体详情可以看一下如下这张图。今天我们重点讲一下关于线上环境最长用的几种分区策略。

·一:rescale分区。rescale分区,重要等级五颗星。这个分区原理是根据上下游算子的数量进行分区,必须要求上游算子和下游算子具备整除关系,这一点一定要记牢。

比如上游有2个source,下游有6个map。那么每个source4 map 5 map 6 map,会分配3个固定的下游map,不会向未分配给自己的分区写入数据。

优点是可以减少连接数,但缺点是有可能会数据倾斜。我们可以看一个具体的案例任务,它的全局并行度设置是175,读取Audioback TableSo并行度是35,并且打开了Rescale开关可以看到最终生成的算子链中使用了Rescale分区,并且175和35具有整除关系。但是下游subtask的每个分区数据分布会稍微不均衡。

·二:rebalance分区。主要等级五颗星,它的分区原理是通过轮询的方式为每个元素分配分区,确保下游的task可以均衡地获取到数据避免数据倾斜。比如上游有两个source,下游有6个map,那么每个source会通过轮询分别向下游的每个map来发送数据。

缺点会随着并行度增加会增加网络传输的开销,但优点可以避免数倾斜。同样的我们看一个具体案例:Flink任务全级并行度设置100,读取kafka Source并行度为50,并且打开了Rebalance开关,可以看到最终生成的算子链中使用了Rebalance分区。

同时我们可以看到下游的subtask的每个分区数据分布均衡。

·三:Shuffle,分区。pain分区重要等级5颗星。这个分区会随机的将上游算子分区中的数据分配到下游算子的分区中,并确保下游的task能够均衡地获得数据。上下游算子并行度并不固定。

我们看一个场景:A算子180分区,B 算是178个分区,C算子178个分区。这三个算子都会使用Hash的方式,将数据依次的传递下去。

→四,发物的分区。发物的分区主要等级四颗星。这个partitioner比较特殊,用于在同一个operatorChain中,上下游算之间的数据转发。实际上数据是直接传递给下游的,要求上下游并行度是一致的。

直接看一个案例,在图中AB算子只是进行了数据的转发,使用了forward分区,AB算子的并行度是一致的。通过上述4个分区的介绍,相信屏幕前的小伙伴们已经肯定掌握了。

这里求一波小红心,只要点赞数超过100,那么立刻安排剩余的4个分区介绍。

我是土哥关注我,每次学习一个知识点,走上人生巅峰指日可待。