Spark数据倾斜-采样倾斜key并分拆join操作-详细图解与代码
本文修改自[1]中的方案六。
?
下面的方案簡述來自[1]
方案適用場景:兩個RDD/Hive表進行join的時候,如果數據量都比較大,無法采用“解決方案五”,那么此時可以看一下兩個RDD/Hive表中的key分布情況。如果出現數據傾斜,是因為其中某一個RDD/Hive表中的少數幾個key的數據量過大,而另一個RDD/Hive表中的所有key都分布比較均勻,那么采用這個解決方案是比較合適的。
方案實現思路:?
* 對包含少數幾個數據量過大的key的那個RDD,通過sample算子采樣出一份樣本來,然后統計一下每個key的數量,計算出來數據量最大的是哪幾個key。
* 然后將這幾個key對應的數據從原來的RDD中拆分出來,形成一個單獨的RDD,并給每個key都打上n以內的隨機數作為前綴,而不會導致傾斜的大部分key形成另外一個RDD。
* 接著將需要join的另一個RDD,也過濾出來那幾個傾斜key對應的數據并形成一個單獨的RDD,將每條數據膨脹成n條數據,這n條數據都按順序附加一個0~n的前綴,不會導致傾斜的大部分key也形成另外一個RDD。
* 再將附加了隨機前綴的獨立RDD與另一個膨脹n倍的獨立RDD進行join,此時就可以將原先相同的key打散成n份,分散到多個task中去進行join了。
* 而另外兩個普通的RDD就照常join即可。
* 最后將兩次join的結果使用union算子合并起來即可,就是最終的join結果。
方案實現原理:對于join導致的數據傾斜,如果只是某幾個key導致了傾斜,可以將少數幾個key分拆成獨立RDD,并附加隨機前綴打散成n份去進行join,此時這幾個key對應的數據就不會集中在少數幾個task上,而是分散到多個task進行join了。具體原理見下圖。
方案優點:對于join導致的數據傾斜,如果只是某幾個key導致了傾斜,采用該方式可以用最有效的方式打散key進行join。而且只需要針對少數傾斜key對應的數據進行擴容n倍,不需要對全量數據進行擴容。避免了占用過多內存。
方案缺點:如果導致傾斜的key特別多的話,比如成千上萬個key都導致數據傾斜,那么這種方式也不適合。
?
?
美團給出的這個方案的圖解不是太清楚,所以我根據代碼在原有圖基礎上做了大量的標注:
由于美團給出的代碼是2016年的,那個時候的spark版本非常舊,并且有很多bug
是不是覺得看得見摸不著?呵呵~我已經將其在Spark3.0下面調試+補充完整:
優化前的完整Java工程
優化后的完整Java工程
Reference:
[1]Spark性能優化指南——高級篇
總結
以上是生活随笔為你收集整理的Spark数据倾斜-采样倾斜key并分拆join操作-详细图解与代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何免费破解BBE Sonic Swee
- 下一篇: excel中npv公式怎么用? Exce