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

數據傾斜是在大數據計算中常見的問題,用最通俗易懂的話來講,數據傾斜無非就是大量的相同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一個計算場景出現數據傾斜問題給出解決方案。大數據

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

相關文章
相關標籤/搜索