Java heap space問題一般解決方案:
設置 set io.sort.mb=10; 排序所使用的內存數量,默認值是100M,和mapred.child.java.opts相對應,opts默認:-Xmx200m,則mb不能超過200M,否則會OOM。
設置 set hive.map.aggr=true; 是否在 Map 端進行聚合,默認為True,會在map端進行部分數據端聚合操作。
(可選)hive.groupby.mapaggr.checkinterval =100000; Map端進行聚合操作的數據條目,根據情況選擇是否設置。
設置 set hive.groupby.skewindata=true; 設置true后當數據出現傾斜時,Hive會自動進行負載均衡。
當hive.groupby.skewindata選項設定為true時,查詢計划會有兩個MR Job。第一個MR Job 中,Map的輸出結果集合會隨機分布到Reduce 中,每個 Reduce 做部分聚合操作,並輸出結果,這樣處理的結果是相同的 Group By Key有可能被分發到不同的 Reduce 中,從而達到負載均衡的目的;第二個 MR Job 再根據預處理的數據結果按照 GroupByKey 分布到 Reduce 中,該過程可以保證相同的 GroupByKey 被分布給同一個Reduce,完成最終的聚合操作。
