(1)資料傾斜根本原因:由於資料分布不均勻,導致map端讀取的資料分布不均勻(資料長尾分布),從而使得map處理的資料量差異過大。
(2)解決思路:hive是分階段執行的,map處理資料量的差異取決於上乙個stage的reduce輸出,所以解決的根本方法就是如何將資料均勻的分布到各個reduce中
(3)出現資料傾斜的主要操作:
(a)join:使用join時,乙個表較小,但是key值集中,使得資料在分發到各個reduce中的時候,某乙個或幾個reduce的資料遠大於平均值
(b)join:大表與大表join時,分桶的判斷欄位0值或空值太多,而這些資料都會到乙個reduce中處理,速度很慢
(c)group by:group by的維度太少,某值的數量太多(如性別***,只有男和女,group by時只有兩個維度,每個維度的資料量都很大),從而導致處理某個值資料的reduce處理非常耗時
(d)count distinct:某特殊值較多,資料將會在乙個reduce中處理,處理此特殊值的reduce耗時
(4)原因概況:
(a)key值分布不均勻
(b)資料自身問題
(c)sql語句問題
(5)資料傾斜表現:任務進度長時間維持在99%(或100%),檢視任務監控頁面,發現只有少量(1個或幾個)reduce子任務未完成。因為其處理的資料量和其他reduce差異過大。
單一reduce的記錄數與平均記錄數差異過大,通常可能達到3倍甚至更多。 最長時長遠大於平均時長。
(6)資料傾斜解決方法:
(a)引數調節:hive.map.aggr = true 在map端部分聚合
(b)引數調節:hive.groupby.skewindata=true 資料傾斜時負載均衡
(c)sql語句調節:join時選擇key值分布較均勻的表作為驅動表,同時做好列裁剪和分割槽裁剪,以減少資料量
(d)sql語句調節:大小表join時,小表先進記憶體
(e)sql語句調節:大表join大表時,把key值為空的key變成乙個字串加上隨機數,把傾斜的資料分到不同的reduce上,由於null值關聯不上,因此處理後不影響最終結果
參考文獻
Hive資料傾斜及解決方法
本人部落格為日常筆記直接貼上,未整理排版,可參考相似內容的部落格。hive學習之路 十九 hive的資料傾斜 hive面試常問 hq語句 優化sort by order by distribute by 分割槽表 分桶表的區別 內部表 外部表的區別 資料傾斜 資料分布不均勻 hive底層的執行引擎 ...
Hive資料傾斜解決方法總結
資料傾斜是進行大資料計算時最經常遇到的問題之一。當我們在執行hiveql或者執行mapreduce作業時候,如果遇到一直卡在map100 reduce99 一般就是遇到了資料傾斜的問題。資料傾斜其實是進行分布式計算的時候,某些節點的計算能力比較強或者需要計算的資料比較少,早早執行完了,某些節點計算的...
Hive資料傾斜解決方法總結
資料傾斜是進行大資料計算時最經常遇到的問題之一。當我們在執行hiveql或者執行mapreduce作業時候,如果遇到一直卡在map100 reduce99 一般就是遇到了資料傾斜的問題。資料傾斜其實是進行分布式計算的時候,某些節點的計算能力比較強或者需要計算的資料比較少,早早執行完了,某些節點計算的...