日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Spark数据倾斜-采样倾斜key并分拆join操作-详细图解与代码

發布時間:2023/12/31 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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操作-详细图解与代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。