我們都知道在進行hive的查詢的時候,設置合理的reduce個數能夠使計算的速度加快。
具體的提高速度的方法有下面這些:
(1) hive.exec.reducers.bytes.per.reducer(每個reduce任務處理的數據量,默認為1000^3=1G)
hive.exec.reducers.max(每個任務最大的reduce數,默認為999)


我們公司的集群當中的這兩個參數的設置如圖所示。
在數據進入到reduce中的時候,在map的輸入的時候總的數據量小於這個數的時候,會交給一個reduce去處理。
(2)set mapred.reduce.tasks = 15;
也可以通過設置reduce的個數進行reduce端的設置。截圖如下:

雖然設置了reduce的個數看起來好像執行速度變快了。但是實際並不是這樣的。
同map一樣,啟動和初始化reduce也會消耗時間和資源,
另外,有多少個reduce,就會有多少個輸出文件,如果生成了很多小文件,那這些小文件作為下一次任務的輸入,則也會出現小文件過多的問題。
對於整個sql的優化可以從下面幾個步驟去優化:
(1)盡量盡早地過濾數據,減少每個階段的數據量,對於分區表要加分區,同時只選擇需要使用到的字段
(2)單個SQL所起的JOB個數盡量控制在5個以下
(3)慎重使用mapjoin,一般行數小於2000行,大小小於1M(擴容后可以適當放大)的表才能使用,小表要注意放在join的左邊。否則會引起磁盤和內存的大量消耗
(4)寫SQL要先了解數據本身的特點,如果有join ,group操作的話,要注意是否會有數據傾斜
set hive.exec.reducers.max=200;
set mapred.reduce.tasks= 200;---增大Reduce個數
set hive.groupby.mapaggr.checkinterval=100000 ;--這個是group的鍵對應的記錄條數超過這個值則會進行分拆,值根據具體數據量設置
(5) 如果union all的部分個數大於2,或者每個union部分數據量大,應該拆成多個insert into 語句,這樣會提升執行的速度。
