對于分布式任務來說,任務執行的并行度十分重要。Hive的底層是MapReduce,所以Hive的并行度優化分為Map端優化和Reduce端優化。
(1)、Map端優化
Map端的并行度與Map切片數量相關,并行度等于切片數量。一般情況下不用去設置Map端的并行度。以下特殊情況下需要設置Map端并行度。
1.1、查詢表中存在大量的小文件(減小Map并行度)
一個小文件相當于一個切片,所以就會為每個小文件開啟一個maptask任務,因此會啟動大量的maptask,造成資源的大量占用。解決問題的辦法就是進行小文件的合并,把多個小文件合并成一個大文件,這個大文件作為一個切片,然后給這個大文件開啟一個maptask任務即可。合并的操作是CombineHiveInputFormat。相關的參數是:
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
(需要知道使用的是CombineHiveInputFormat操作就可以了,具體的命令用到的時候再查)
1.2、map端有復雜的查詢邏輯
若SQL語句中有正則替換、json解析等復雜耗時的查詢邏輯時,map端的計算會相對慢一些。為了提高map端的計算速度,在計算資源充足的情況下就可以適當的提高map端的并行度。這是只需要減小每個切片的數據量大小就可以了。相關的參數是:
--------------一個切片的最大值---------------
set mapreduce.input.fileinputformat.split.maxsize=256000000;
(2)、Reduce端優化
Reduce端并行度的確定邏輯是:若指定mapreduce.job.reduces的值為一個非負整數,則reduce并行度為指定的值。否則Hive自行估算Reduce并行度。其估算的邏輯是:
假設Job輸入的文件大小為toatlInputBytes,每個Reducer的數據量參數hive.exec.reducers.bytes.per.reducer的值為bytesPerReducer,以及最大Reducer數量參數hive.exec.reducers.max的值為maxReducers。則Reducer端的并行度為:
min(ceil(toatlInputBytes/bytesPerReducer),maxReducers)。
但是在有些情況下,這種估算方式也有不足,因為它是以整個文件大小作為分子進行的估算,合理的應該是進入Reduce端的文件大小來估算,因為整個文件在進入Map端之后可能進行過聚合,那么此時進入Reduce端的數據量就不是整個文件大小。
總結來說:Reduce端的優化就是在于手動的設置并行度的數量,如果未手動設置,則會按照上面的方式來計算并行度。