码迷,mamicode.com
首页 > 其他好文 > 详细

【Spark调优】大表join大表,少数key导致数据倾斜解决方案

时间:2019-03-26 01:19:15      阅读:442      评论:0      收藏:0      [点我收藏+]

标签:算子   soft   master   lan   情况   而且   www.   ros   使用场景   

【使用场景】  

  两个RDD进行join的时候,如果数据量都比较大,那么此时可以sample看下两个RDD中的key分布情况。如果出现数据倾斜,是因为其中某一个RDD中的少数几个key的数据量过大,而另一个RDD中的所有key都分布比较均匀,此时可以考虑采用本解决方案。

 

【解决方案】  

  1. 对有数据倾斜那个RDD,使用sample算子采样出一份样本,统计下每个key的数量,看看导致数据倾斜数据量最大的是哪几个key。
  2. 然后将这几个key对应的数据从原来的RDD中拆分出来,形成一个单独的RDD,并给每个key都打上n以内的随机数作为前缀;不会导致倾斜的大部分key形成另外一个RDD。
  3. 接着将需要join的另一个RDD,也过滤出来那几个倾斜key对应的数据并形成一个单独的RDD,将每条数据膨胀成n条数据,这n条数据都按顺序附加一个0~n的前缀,不会导致倾斜的大部分key也形成另外一个RDD。
  4. 再将附加了随机前缀的独立RDD与另一个膨胀n倍的独立RDD进行join,这样就可以将原先相同的key打散成n份,分散到多个task中去进行join了。
  5. 而另外两个普通的RDD就照常join即可。
  6. 最后将两次join的结果使用union算子合并起来即可,就是最终的join结果。

 

【方案优点】

  对于两个大RDD进行join时的数据倾斜,如果只是某几个key导致了倾斜,采用该方式可以用最有效的方式打散key进行join。而且只需要针对少数倾斜key对应的数据进行扩容n倍,不需要对全量数据进行扩容,避免了占用过多内存。

 

【方案局限】

  如果导致倾斜的key特别多的话,比如成千上万个key都导致数据倾斜,就不能使用本解决方案了。

 

【代码实现】

  我对上述方案做了代码实现,见我的github:https://github.com/wwcom614/Spark

  Java版实现

 

  上一篇:【Spark调优】小表join大表数据倾斜解决方案

【Spark调优】大表join大表,少数key导致数据倾斜解决方案

标签:算子   soft   master   lan   情况   而且   www.   ros   使用场景   

原文地址:https://www.cnblogs.com/wwcom123/p/10597825.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!