map階段
1.hive.vectorized.execution.enabled
默認false. map方法逐行處理數據,開啟之后hive構造一個批量輸入的數組,一次處理1萬條數據。(數據量不大,或計算不復雜是不是沒必要開啟?
MapReduce只支持map端向量化執行,TEZ和SPARK支持map和reduce端向量化執行。
2.hive.ignore.mapjoin.Hint
默認true. 開啟忽略Hint關鍵字,若要使用關鍵字,需關閉
3.hive.auto.convert.join
默認true. 開啟mapjoin自動優化
4.hive.smalltable.filesize/hive.mapjoin.smalltable.filesize
默認2500000(25M),join時小表數據量小於該值自動開啟mapjoin優化
hive.auto.convert.join.use.nonstaged
默認false. 是否省略小表加載作業。一些mapjoin,如果小表沒有必要做數據過濾或者列投影,則直接省略小表加載時額外的MapReduce作業
5.hive.map.aggr
默認true. 是否開啟map任務聚合
6.hive.map.aggr.hash.percentmemory
默認0.5,表示開啟map任務聚合,聚合所用hash表最多占整個map內存50%
7.hive.mapjoin.optimized.hashtable
默認true. 用內存優化的hash表做mapjoin. 由於該類型hash表無法序列化到磁盤,只適用於TEZ和spark
8.hive.mapjoin.optimized.hashtable.wbsize
默認10485760(10M). 優化hash表使用鏈塊內存緩存,可以優化數據較大的表加載,小表不適用,會浪費內存
9.hive.map.groupby.sorted
hive2.0之后默認true. 分桶表和排序表,若分組聚合的key值與分桶或排序的列一致,優化使用BucketizedHiveInputFormat
10.hive.vectorized.execution.mapjoin.native.enabled
默認false. 是否使用原生向量化執行模式執行mapjoin。比普通mapjoin快
11.hive.vectorized.execution.mapjoin.minmax.enabled
默認false. 是否使用vector mapjoin hash表,用於整型連接的最大值和最小值過濾
reduce階段
與mapper讀取本地文件不同,reducer會去拉取遠程map節點產生的數據,這里會涉及網絡IO和磁盤IO。
如非必須對數據全局處理如全局排序,關掉reduce階段的操作就可以提升程序性能。
1.mapred.reduce.tasks
默認-1. 設置reducer的數量,-1代表系統根據需要自行決定reducer數量
2.hive.exec.reducers.bytes.per.reducer
hive0.14版本后默認256M. 設置每個reducer處理的數據量,若輸入reduce數據量1G,那么會拆分為4個reducer任務(這應該是在map端無小文件的情況下吧
3.hive.exec.reducers.max
設置一個作業運行的最大reduce個數,默認值999
4.hive.multigroupby.singlereducer
如果一個SQL有多分組聚合操作,且分組使用相同的字段,那么這些分組聚合可以用一個作業的reduce完成,而不是分解成多個作業、多個reduce。可以減少作業重復讀取和shuffle的操作
5.hive.mapred.reduce.tasks.speculative.execution
表示是否開啟reduce任務推測執行。即系統在一個reduce任務中執行進度遠低於其他任務的執行進度,會嘗試在另外的機器上啟動一個相同的reduce任務
6.hive.optimize.reducededuplication
當數據需要按相同的鍵再次聚合時,開啟這個配置可以減少重復的聚合操作
7.hive.vectorized.execution.reduce.enabled
是否啟用reduce任務的向量化執行,默認true。mapreduce計算引擎不支持reduce階段向量化處理
8.hive.vectorized.execution.reduce.groupby.enabled
reduce任務分組聚合查詢的向量化執行,默認true。mapreduce計算引擎不支持reduce階段向量化處理
shuffle階段
從mapper的map方法輸出到reducer的reduce方法輸入的整個過程
mapreduce的map端聚合-combiner類
combiner的邏輯可以直接使用reducer的邏輯,對本地的mapper任務做reducer程序邏輯,一般稱為map端的reduce任務。可以減少shuffle過程的數據量,減輕系統的磁盤IO與網絡IO
1.hive.map.aggr
默認true. 表示開啟map端聚合。啟用之后,會在map端多一個reduce操作,這是為了減少map任務的輸出,減少傳輸到下游任務的shuffle數據量。但若數據經聚合后不能明顯減少,那就會浪費機器的IO資源。所以這時引入兩個參數hive.map.aggr.hash.min.reduction和hive.groupby.map.aggr.checkinterval用於控制何時開啟聚合
2.hive.map.aggr.hash.min.reduction
是一個閾值,默認0.5
3.hive.groupby.mapaggr.checkinterval
默認100000. hive啟用combiner會嘗試取這個配置對應的數據量進行聚合,聚合后數據除以聚合前數據,若小於hive.mapaggr.hash.min.reduction會自動關閉(這里應該是大於??)
4.hive.map.aggr.hash.min.percentmemory
默認0.5. mapper端聚合占用的最大內存。若分配給該節點的最大堆為1024MB,那么聚合能使用hash表最大內存512MB
5.hive.map.aggr.hash.force.flush.memory.threshold
默認0.9. 該值表示當聚合占用hash表內存超0.9觸發落磁盤,如hash表內存512MB,當hash表數據內存超461MB時觸發hash表寫入磁盤
mapreduce作業輸出
1.開啟中間作業文件壓縮:
hive.exec.compress.intermediate=true
2.開啟寫入hive或hdfs文件壓縮:
hive.exec.compress.output=true
要在mapreduce中起作用的前提是,還要設置:
mapred.output.compression.codec; mapred.output.compression兩個屬性
參考:
set hive.exec.compress.intermediate=true;
set mapreduce.map.output.compress=true;
set hive.intermadiate.compression.code=org.apache.hadoop.io.compress.SnappyCodec;
set hive.intermediate.compression.type=BLOCK;
小文件壓縮可以看:hive優化2-hive的Input階段:inputsplit與map數量、小文件
mapreduce作業與hive配置
1.hive.optimize.countdistinct
默認true. 3.0新增配置項,優化去重計數作業,分成兩個作業來處理,以達到減緩SQL數據傾斜作用
2.並行:hive.exec.parallel=true;hive.exec.parallel.thread.num=8
默認為False;8. 第一個參數是開啟作業並行。如果一個SQL有兩個階段stage1、stage2, 沒有直接以來的關系,開啟該參數會以並行方式執行這兩個階段;第二個參數指一個作業最多允許8個作業同時執行
3.hive.exec.mode.local.auto
默認false, 是否開啟本地執行模式,數據量較小的作業可以在單台機器上處理完所有任務,能有效節省時間。還需幾個參數:hive.exec.mode.local.auto.inputbytes.max默認值134217728(128M),表示作業處理數據量小於該值,開啟本地模式;hive.exec.mode.local.auto.tasks.max默認值為4,作業啟動數目不大於該值,本地模式才生效,0.9版本之后該參數為:hive.exec.mode.local.auto.input.files.max
4.hive.optimize.correlation
默認false,相關性優化,配置可以減少重復的shuffle操作(在join和groupby的key值一樣的情況下可以優化)