如何解決大數據計算中常見的數據傾斜問題?

數據傾斜是在大數據計算中常見的問題,用最通俗易懂的話來說,數據傾斜無非就是大量的相同key被partition分配
到一個分區裏,造成了'一個人累死,其他人閒死'的情況,這種情況是我們不能接受的,這也違背了並行計算的初衷,首先
一個節點要承受着巨大的壓力,而其他節點計算完畢後要一直等待這個忙碌的節點,也拖累了整體的計算時間,可以說
效率是十分低下的。
以下針對spark具體計算場景,給出數據傾斜解決方案:
場 景
當RDD執行reduceByKey等聚合類shuffle算子或者在Spark SQL中使用group by語句進行分組聚合時,產生數據
傾斜。
出現數據傾斜原因:
在上述分組場景中,具有相同的key的數據就會被分配到同一個組當中,從而分配到同一分區。如果某些相同key
的數據量非常大,而其他是key的數據量相對較小,此時就可能產生比較嚴重的數據傾斜。
解決方案
本方案通過兩個階段聚合:
階段一
先給每個key都打上一個隨機數,比如10以內的隨機數,比如(spark,1) (spark, 1) (spark, 1) (spark, 1),就會變成
(1_spark, 1) (1_spark, 1) (2_spark, 1) (2_spark, 1)。打上隨機數以後,原先一樣的key就變成不一樣的了。然後對
數據進行reduceByKey等聚合操作,局部聚合結果變成了(1_spark, 2) (2_spark, 2)。
階段二
基於階段一局部聚合的數據,將各個key的前綴給去掉,就會變成(spark,2)(spark,2),再次進行全局聚合操作,得
到最終結果,比如(spark, 4)。

小結
數據傾斜是大數據計算中常見的問題,很多場景的計算都會出現數據傾斜的情況,而解決數據傾斜的主體思路都是
在計算過程當中儘量能將數據均勻地分配到各個分區,從而充分提高每個計算節點的利用率,提高整體的計算效
率。本文當中是針對spark一個計算場景出現數據傾斜問題給出解決方案。

更多資源請關注黑馬程序員廣州中心官方公號獲取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章