spark解決資料傾斜問題

2021-10-03 14:11:08 字數 2277 閱讀 2628

參考:

資料傾斜發生的原理

資料傾斜的原理很簡單:在進行shuffle的時候,必須將各個節點上相同的key拉取到某個節點上的乙個task來進行處理,比如按照key進行聚合或join等操作。此時如果某個key對應的資料量特別大的話,就會發生資料傾斜。比如大部分key對應10條資料,但是個別key卻對應了100萬條資料,那麼大部分task可能就只會分配到10條資料,然後1秒鐘就執行完了;但是個別task可能分配到了100萬資料,要執行一兩個小時。因此,整個spark作業的執行進度是由執行時間最長的那個task決定的。

下圖就是乙個很清晰的例子:hello這個key,在三個節點上對應了總共7條資料,這些資料都會被拉取到同乙個task中進行處理;而world和you這兩個key分別才對應1條資料,所以另外兩個task只要分別處理1條資料即可。此時第乙個task的執行時間可能是另外兩個task的7倍,而整個stage的執行速度也由執行最慢的那個task所決定。

解決方案一:使用hive etl預處理資料

我理解為分區分桶

解決方案二:過濾少數導致傾斜的key

過來一些資料

方案適用場景:如果發現導致傾斜的key就少數幾個,而且對計算本身的影響並不大的話,那麼很適合使用這種方案。比如99%的key就對應10條資料,但是只有乙個key對應了100萬資料,從而導致了資料傾斜。

解決方案三:提高shuffle操作的並行度

方案適用場景:如果我們必須要對資料傾斜迎難而上,那麼建議優先使用這種方案,因為這是處理資料傾斜最簡單的一種方案。

調大reduce 的數量

解決方案四:兩階段聚合(區域性聚合+全域性聚合)

我理解為 給key前增加隨機數,切分的時候就可以打散

方案實現原理:將原本相同的key通過附加隨機字首的方式,變成多個不同的key,就可以讓原本被乙個task處理的資料分散到多個task上去做區域性聚合,進而解決單個task處理資料量過多的問題。接著去除掉隨機字首,再次進行全域性聚合,就可以得到最終的結果。具體原理見下圖。

解決方案五:將reduce join轉為map join

只適用於乙個大表和乙個小表的情況,不會發生shuffle,也就根本不會發生資料傾斜

方案缺點:適用場景較少,因為這個方案只適用於乙個大表和乙個小表的情況。畢竟我們需要將小表進行廣播,此時會比較消耗記憶體資源,driver和每個executor記憶體中都會駐留乙份小rdd的全量資料。如果我們廣播出去的rdd資料比較大,比如10g以上,那麼就可能發生記憶體溢位了。因此並不適合兩個都是大表的情況。

解決方案六:取樣傾斜key並分拆join操作

方案實現思路:

對包含少數幾個資料量過大的key的那個rdd,通過sample運算元取樣出乙份樣本來,然後統計一下每個key的數量,計算出來資料量最大的是哪幾個key。

然後將這幾個key對應的資料從原來的rdd中拆分出來,形成乙個單獨的rdd,並給每個key都打上n以內的隨機數作為字首,而不會導致傾斜的大部分key形成另外乙個rdd

解決方案七:使用隨機字首和擴容rdd進行join

方案適用場景:如果在進行join操作時,rdd中有大量的key導致資料傾斜,那麼進行分拆key也沒什麼意義,此時就只能使用最後一種方案來解決問題了。

方案實現思路:

該方案的實現思路基本和「解決方案六」類似,首先檢視rdd/hive表中的資料分布情況,找到那個造成資料傾斜的rdd/hive表,比如有多個key都對應了超過1萬條資料。

然後將該rdd的每條資料都打上乙個n以內的隨機字首。

同時對另外乙個正常的rdd進行擴容,將每條資料都擴容成n條資料,擴容出來的每條資料都依次打上乙個0~n的字首。

最後將兩個處理後的rdd進行join即可。

spark資料傾斜問題

資料傾斜 加更大記憶體 跟cpu硬體是效能優化的根本之道 一 資料傾斜帶來的致命性後果 1.oom 根本原因資料太多 一般oom都是由於資料傾斜所致,spark基於jvm之上的 2.速度非常慢 二 資料傾斜的基本特徵 1.任務分配不均勻 2.個別task處理過度大量的資料 shuffle過程中遇到同...

解決 spark 中的資料傾斜問題

發現資料傾斜的時候,不要急於提高 executor 的資源,修改引數 或是修改程式,首先要檢查資料本身,是否存在異常資料。1 資料問題造成的資料傾斜 找出異常的 key 如果任務長時間卡在最後最後 1 個 幾個 任務,首先要對 key 進行 抽樣分析,判斷是哪些 key 造成的。選取 key,對資料...

解決spark中遇到的資料傾斜問題

多數task執行速度較快,少數task執行時間非常長,或者等待很長時間後提示你記憶體不足,執行失敗。常見於各種shuffle操作,例如reducebykey,groupbykey,join等操作。key本身分布不均勻 包括大量的key為空 key的設定不合理 shuffle時的併發度不夠 計算方式有...