1. 對group by的調優 (開啟map端聚合)
說明 : 默認情況下 Map階段相同的key 會被發送到同一個reduce中去聚合
當某個key數據量過大時,就造成了數據傾斜
什么是map端聚合?
並不是所有聚合操作,都需要在reduce端聚合,可以在map端先將部分數據,進行聚合,最終數據在reduce聚合
參數設置
-- 是否開啟map的聚合(默認為true) set hive.map.aggr=true; -- 在 Map 端進行聚合操作的條目數目 set hive.groupby.mapaggr.checkinterval=100000; -- 發生數據傾斜時,進行負載均衡 set hive.groupby.skewindata=true; 說明 : 當選項設定為 true,生成的查詢計划會有兩個 MR Job。 第一個 MR Job 中,Map 的輸出結果(outKey) 會隨機分布到 Reduce 中, 每個 Reduce 做部分聚合操作,並輸出結果
這樣處理好處是 相同的 Group By Key 有可能被分發到不同的 Reduce 中,從而達到負載均衡的目的 第二 個 MR Job 再根據預處理的數據結果
按照 Group By Key 分布到 Reduce 中(這個過程可以保證 相同的 Group By Key 被分布到同一個 Reduce 中),最后完成最終的聚合操作
測試
INFO : Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
開啟map端聚合 : 748 rows selected (31.345 seconds)
關閉map端聚合 : 748 rows selected (38.138 seconds)