Spark数据倾斜解决方案实战(二)

 

 

 

导读:上一期讲了[Spark数据倾斜解决方案实战(一)],这个方法有个很好的优点就是,你可以不改代码,直接通过参数spark.default.parallelism就可以调整。本期介绍第二种,自定义partitioner的方法,我们实现spark提供的分区接口,自定义分区。这样有个什么好处呢,我们想让哪个数据在哪个分区就能在那个分区,这个方法可真是太香了,我们来看看吧~

本系列文章,模拟数据倾斜场景,探索数据倾斜解决方案。系列完成会把代码开源~

本文经授权转自公众号DLab数据实验室

作者 | 小舰

出品 | DLab数据实验室(ID:rucdlab)

 

 

 

自定义partitioner

 

01

数据准备

数据准备工作上一期已经介绍过了,这里就不多介绍了,直接开始看第二种数据倾斜解决方法。

02

自定义分区

首先我们要创建一个自定义的partitioner的类,继承Spark本身提供的接口,实现其中的方法。其实就有两个比较重要的方法,如下所示。

override def numPartitions: Int = numParts 这个方法就是来设定,你的任务并发数的;  override def getPartition(key: Any): Int = {}这个方法就是来自定义实现你的分区逻辑的;

比如我这里是这样规定的,如果你的id超过了1亿,那就让这些数据平均分配到各个分区中,如果你没看第一篇文章我的倾斜数据是什么样的,这里可能比较懵(这里再简单说一遍,就是我的数据总共有1.2亿条,前1亿条数据都是连续的,后面的2000万条数据对id做了处理,使他们模10余8),这里就是将这2000万条数据再经过处理,让他们重新平均分配到各个分区中。

看代码实现:

 

03

跑任务

 

我们跑一下job看看效果,我们的并发数依然是10,果不其然,我们的数据倾斜现象没了,都老老实实的进行了平均分配。

附一下上一期的数据倾斜的情况:

04

总结

 

所以,这种方式我们不用改变并行度,直接根据自己的意愿来安排每条数据的分区,非常棒。当然了,如果非要说缺点,跟调整并行度一样,我们都是针对不同的key来进行操作的,如果是由于key相同而引起的数据倾斜,还要想另外的办法。所以想知道么,等我下一期~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值