Flink数据倾斜以及解决之道

什么是数据倾斜?

数据倾斜问题是分布式架构的重要难题,它破坏了MPP架构中各个节点对等的要求,导致单节点(倾斜节点)所存储或者计算的数据量远大于其他节点,所以会造成以下危害: 存储上的倾斜会严重限制系统容量,在系统容量不饱和的情况下,由于单节点倾斜的限制,使得整个系统容量无法继续增长。

FLINK中,如何定位数据倾斜?

1、进入flink-webUI界面

 

2、哪类算子易出现数据倾斜?

 

 3、为什么keyedProcess易出现数据倾斜?

        1)非KeyProcess的分区策略(默认shuffle 或 forward):

        rebalance(以轮循方式均匀地分布到下一个操作)
        shuffle(输出元素均匀随机地打乱到下一个操作)

                forward(并行分区传输到下一个操作算子)

                rescale(如果上游操作的并行度为2,而下游操作的并行度为4,那么一个上游操作将把元素分配给两个下游操作,而另一个上游操作将分配给另外两个下游操作)

                global 输出值都转到下一个处理操作符的第一个实例

        2)如果非KeyedProcess的默认分区策略不满足需求,还可以调用partitionCustom自定义分区。

        3)keyProcess的分区策略:

                KeyGroupRangeAssignment的assignToKeyGroup 这个api决定的分区策略。

                简而言之:你的key,经过hash再hash之后,除以分区数取余得到数据的分区号。

                所以如果你的key本身分布就不是均匀的,那么大概率会出现倾斜问题。

4、数据倾斜现象(选择keyStream算子,查看subTasks,观察数据量是否均匀)

 5、优化方案

        1)keyProcess的分区数选择为质数,因为质数取余更均匀。

        2)key再针对细分(没有key状态计算的场景可以如此用,如果是key状态计算,比如某类商品的windowCount,要么容忍倾斜,要么细分状态后再用算子聚合状态计算)

               比如数据为: 

                    

        Tuple3.of("a","东京","m")

        Tuple3.of("a","东京1","m1")       

        Tuple3.of("a","东京","m2")

        Tuple3.of("a","东京1","m")   

        Tuple3.of("b","东京1","m1")

        Tuple3.of("b","东京","m2")  

如果你选择的key是tuple.f1,那么出来两个分区,分区数据量分别为 4和2。但是如果选择为tuple.f1+tuple.f2 那么分区数据量分别为:2,2,1,1。数据倾斜便没有那么严重。

6、进阶解决方案:

其实我们没有必要生成的key一定是数据本身的key,例如第五步的例子,即使你采取第二种解决方案,出来的key也是(a,"东京")这种样式,但如果你在生成key的时候,把这类key转换为指定范围内的数字(前提是没有key状态计算,只是保证同类key顺序执行你的process),例如:

 这样你的key相对而已,就是在一个可控的范围内,比如范围是1-1000,而你的分区数是127,这种情况下,分区相对而言会均匀很多。

当然,最优!最优的解决方案,是你按权重去对key进行分配,这种方案需要你对key的权重比较了解,再针对性使用例如switch这种方式去给对应的权重数据分配指定的key。

    

    

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink数据倾斜是指在数据处理过程中,某个任务的输入数据量远大于其他任务,导致该任务的处理速度变慢,甚至导致该任务运行失败。数据倾斜的产生原因可能是数据分布不均或者数据质量不良等原因。 为了解决Flink数据倾斜问题,可以采取以下优化措施: 1. 数据预处理 数据预处理是指在数据进入Flink之前,对数据进行预处理和过滤,去掉一些不必要的数据,减少数据量。可以通过过滤、聚合、采样等方式对数据进行预处理,减少不必要的数据处理,从而减轻任务的负载。 2. 数据重分区 数据重分区是指在数据进入Flink之后,对数据进行重新分区,将数据均匀地分配到各个任务中。可以通过对数据进行随机分区、哈希分区、范围分区等方式,使得数据在各个任务中分布均匀,减少数据倾斜的发生。 3. 动态调整并发度 动态调整并发度是指在任务运行过程中,根据任务的负载情况动态调整任务的并发度。可以根据每个任务的输入数据量、处理速度等因素,动态调整任务的并发度,使得任务在各个节点上均衡运行,减少数据倾斜的发生。 4. 均值重算 均值重算是指在数据倾斜发生时,对数据进行均值重算,将数据分成多个子任务,分别处理后再合并结果。可以通过对数据进行随机分组、哈希分组等方式,将数据均匀地分配到多个子任务中,从而减轻任务的负载,避免数据倾斜的发生。 需要根据具体的业务需求来选择适合的优化措施。不同的优化措施可以结合使用,以达到更好的优化效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值