Hive數據傾斜及處理
① 數據傾斜的概念及原因
1.1 數據傾斜
數據傾斜就是數據的分佈不平衡,某些地方特別多,某些地方又特別少,導致的在處理數據的時候,有些很快就處理完了,而有些又遲遲未能處理完,導致整體任務最終遲遲無法完成,這種現象就是數據傾斜。
針對mapreduce的過程來說就是,有多個reduce,其中有一個或者若干個reduce要處理的數據量特別大,而其他的reduce處理的數據量則比較小,那麼這些數據量小的reduce很快就可以完成,而數據量大的則需要很多時間,導致整個任務一直在等它而遲遲無法完成。
1.2 產生數據傾斜的原因
- key分佈不均勻
上面就說過,數據傾斜是因爲reduce的數據量大小差異過大,而reduce的數據是分區的結果,分區是對key求hash值,根據hash值決定該key被分到某個分區,進而進入到某個reduce,而如果key很集中或者相同,那麼計算得到它們的hash值可能一樣,那麼就會被分配到同一個reduce,就會造成這個reduce所要處理的數據量過大。
- 業務數據本身的特性
比如某些業務數據作爲key的字段本就很集中,那麼結果肯定會導致數據傾斜啊。
還有其他的一些原因,但是,根本原因還是key的分佈不均勻,而其他的原因就是會造成key不均勻,進而導致數據傾斜的後果,所以說根本原因是key的分佈不均勻。
1.3 數據傾斜的表現
- 任務進度長時間維持在99%(或100%),查看任務監控頁面,發現只有少量(1個或幾個)reduce子任務未完成。因爲其處理的數據量和其他reduce差異過大。
- 單一reduce的記錄數與平均記錄數差異過大,通常可能達到3倍甚至更多。 最長時長遠大於平均時長。
② 數據傾斜的解決辦法
2.1 設置參數
hive.map.aggr = true // Map 端部分聚合,相當於Combiner;
hive.groupby.skewindata=true //
有數據傾斜的時候進行負載均衡,當選項設定爲 true,生成的查詢計劃會有兩個 MR Job。第一個 MR Job 中,Map 的輸出結果集合會隨機分佈到 Reduce 中,每個 Reduce 做部分聚合操作,並輸出結果,這樣處理的結果是相同的 Group By Key 有可能被分發到不同的 Reduce 中,從而達到負載均衡的目的;第二個 MR Job 再根據預處理的數據結果按照 Group By Key 分佈到 Reduce 中(這個過程可以保證相同的 Group By Key 被分佈到同一個 Reduce 中),最後完成最終的聚合操作。
2.2 SQL語句優化
- 大小表join
使用map join讓小的維度表(1000條以下的記錄條數) 先進內存。在map端完成reduce。
- 大表Join大表
把空值的key變成一個字符串加上隨機數,把傾斜的數據分到不同的reduce上,由於null值關聯不上,處理後並不影響最終結果。
- count distinct大量相同特殊值
count distinct時,將值爲空的情況單獨處理,如果是計算count distinct,可以不用處理,直接過濾,在最後結果中加1。如果還有其他計算,需要進行group by,可以先將值爲空的記錄單獨處理,再和其他計算結果進行union。
- 特殊情況特殊處理
在業務邏輯優化效果的不大情況下,有些時候是可以將傾斜的數據單獨拿出來處理。最後union回去。
參考鏈接:https://www.jianshu.com/p/42be5ca8b11d
參考鏈接:https://blog.csdn.net/xinzhi8/article/details/71455883
參考鏈接:https://blog.csdn.net/qq_35036995/article/details/80298403