Spark 数据倾斜解决方案实战(三)
增加随机前缀
上两期,我们分别讲了通过提高并行度和自定义分区策略来解决数据倾斜的方法,同时我们也讲到了他们的共同缺点:针对于不同 key 倾斜到同一个节点到场景。那如果是同样的 key 太大怎么办呢?如何将同一个 key 分配到不同的节点呢?答案就是通过对 key 增加前后缀的方式,这样就可以重新为这些数据划分分区了。
这种方式解决起来比较麻烦,我们可以一步一步来。
1.数据准备
由于上面两期,我们都是用的 1.2 亿条数据的单表来进行测试的,本节的场景需要涉及到两表 join,因此我们再次构造一个小表。
2.判断数据倾斜
如何判断数据倾斜呢?如果我们看到在任务执行的时候,大部分 task 都执行完毕,只剩若干个任务还在运行,并且运行时间和处理数据量远超其他 task,则可以认为发生了数据倾斜,如下图所示,时间和数据量相差比较大。

2.判断倾斜键
3.对重复键进行加前缀
首先,我们需要查询出这两个表对数据,得到两份数据 DataFrame
然后,对这些数据的共有 key 进行加前缀操作
最后,我们重新将添加前缀的数据进行 join 计算
4.运行无 key 前缀优化的性能结果
我们可以看到无论是时间还是数据量上都差别很大,而且总运行时长为 11 分钟左右

经过优化后,我们再次运行
我们可以看到,整体的时间和数据量相差不大,数据倾斜现象基本消失,整个任务运行 3 分钟左右。

总结
好了,到这里我们就把数据倾斜常用的处理方式介绍完了。在实际的场景中,可能要综合这几种方法来综合调优,欢迎一起讨论~
版权声明: 本文为 InfoQ 作者【小舰】的原创文章。
原文链接:【http://xie.infoq.cn/article/401f397422ac95260f2a3a155】。文章转载请联系作者。
评论