暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

DLab数据实验室 2020-11-17
151


导读:上一期讲了[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相同而引起的数据倾斜,还要想另外的办法。所以想知道么,等我下一期~


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

●大数据计算生态之数据计算(二)

●大数据计算生态之数据计算(一)

●大数据计算生态之数据存储

Spark训练营(一)-- 开发环境搭建及wordCount实战

●Spark训练营(二)-- SparkStreaming流计算组件wordCount实战

●Spark训练营(三)-- GraphX图计算组件最短路算法实战

一文纵览大数据计算生态

●原创|带你厘清分布式、数据库的那些一致性

深入浅出大数据组件之Kafka消息队列

一个故事让你理解什么是区块链

实时数据流计算引擎Flink和Spark剖析

自定义Hadoop的输入格式


文章都看完了不点个 吗

欢迎    点赞、在看、分享  三连哦~~



文章转载自DLab数据实验室,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论