什麼是資料傾斜?
簡單來說資料傾斜就是資料的key的分化嚴重不均,造成一部分資料很多,一部分資料很少的局面。
資料傾斜產生的原因是什麼?
舉個 word count 的入門例子,它的map 階段就是形成 (「aaa」,1)的形式,然後在reduce 階段進
行 value 相加,得出 「aaa」 出現的次數。若進行 word count 的文字有100g,其中 80g 全部是 「aaa」 剩
下 20g 是其餘單詞,那就會形成 80g 的資料量交給乙個reduce 進行相加,其餘 20g 根據 key 不同分散到不
同 reduce 進行相加的情況。如此就造成了資料傾斜,臨床反應就是 reduce 跑到 99%然後一直在原地等著 那
80g 的reduce 跑完。
如此一來 80g 的 aaa 將發往同乙個 reducer ,由此就可以知道reduce 最後 1% 的工作在等什麼了。
為什麼說資料傾斜與業務邏輯和資料量有關?
從另外角度看資料傾斜,其本質還是在單台節點在執行那一部分資料reduce任務的時候,由於資料量大,跑不動,造成任務卡住。若是這台節點機器記憶體夠大,cpu、網路等資源充足,跑80g 左右的資料量和跑10m 資料量所耗時間不是很大差距,那麼也就不存在問題,傾斜就傾斜吧,反正機器跑的動。所以機器配置和資料量存在乙個合理的比例,一旦資料量遠超機器的極限,那麼不管每個key的資料如何分布,總會有乙個key的資料量超出機器的能力,造成reduce 緩慢甚至卡頓。
業務邏輯造成的資料傾斜會多很多,日常使用過程中,容易造成資料傾斜的原因可以歸納為幾點:
1)group by
2)distinct count(distinct xx)
3)join
如何處理group by的資料傾斜問題?
set hive.groupby.skewindata=true;
hive.groupby.skewindata=true:資料傾斜時負載均衡,當選項設定為true,生成的查詢計畫會有兩個
mrjob。第乙個mrjob 中,map的輸出結果集合會隨機分布到reduce中,每個reduce做部分聚合操作,並
輸出結果,這樣處理的結果是相同的groupby key有可能被分發到不同的reduce中,從而達到負載均衡的目
的;第二個mrjob再根據預處理的資料結果按照groupby key分布到reduce中(這個過程可以保證相同的
groupby key被分布到同乙個reduce中),最後完成最終的聚合操作。
由上面可以看出起到至關重要的作用的其實是第二個引數的設定,它使計算變成了兩個mapreduce,先在第乙個中在 shuffle 過程 partition 時隨機給 key 打標記,使每個key 隨機均勻分布到各個 reduce 上計算,但是這樣只能完成部分計算,因為相同key沒有分配到相同reduce上,所以需要第二次的mapreduce,這次就回歸正
常 shuffle,但是資料分布不均勻的問題在第一次mapreduce已經有了很大的改善,因此基本解決資料傾斜。
hive常見優化方案有哪些?
hive優化
Hive解決資料傾斜問題
簡單來說資料傾斜就是資料的key 的分化嚴重不均,造成一部分資料很多,一部分資料很少的局面。舉個 word count 的入門例子,它的map 階段就是形成 aaa 1 的形式,然後在reduce 階段進行 value 相加,得出 aaa 出現的次數。若進行 word count 的文字有100g,...
Hive解決資料傾斜問題
什麼是資料傾斜以及資料傾斜式怎麼產生的?簡單來說資料傾斜就是資料的key的分化嚴重不均,造成一部資料很多,一部分資料很少的局面。舉個 word count 的入門例子,它的map 階段就是形成 aaa 1 的形式,然後在reduce 階段進行 value 相加,得出 aaa 出現的次數。若進行 wo...
Hive解決資料傾斜方法
注 group by 優於distinct group 情形 group by 維度過小,某值的數量過多 後果 處理某值的reduce非常耗時 解決方式 採用sum group by的方式來替換count distinct 完成計算。2 count distinct count distinct x...