Hive參數配置調優

hive通過將查詢劃分成一個或多個MapReduce任務達到並行處理的目的。每個任務都可能具有多個mapper和reducer任務,其中至少有一些是可以並行執行的。

確定最佳的mapper個數和reducer個數取決於多個變量,例如輸入的數據量大小以及對這些數據執行的操作類型等。

保持平衡性是很有必要的,對於Spark/Hadoop這樣的大數據系統來講,數據量大並不可怕,可怕的是數據傾斜,每個節點處理的運算不均衡。

如果有太多的mapper或reducer任務,就會導致啓動階段、調度和運行job過程中產生過多的開銷;而如果設置的數量太少,那就有可能沒充分利用好集羣內在並行性。

mapred.reduce.tasks 

所提交 Job 的 reduer 的個數,使用 Hadoop Client 的配置。 

1

hive.mapred.mode 

Map/Redure 模式,如果設置爲 strict,將禁止3中類型的查詢:

1.分區表的where篩選條件必須含有分區字段;

2.對使用了order by語句的查詢,必須使用limit語句

(order by語句爲執行排序會將所有的結果集數據分發到同一個reducer中進行處理,增加limit語句可以防止reducer額外執行很長時間)

3.限制笛卡兒積的查詢,就是有where語句,而沒有on語句。 

'nonstrict'

hive.merge.mapfiles 

在Map-only的任務結束時合併小文件

是否開啓合併 Map 端小文件,當Hive輸入由很多個小文件組成,由於每個小文件都會啓動一個map任務,

如果文件過小,會使得map任務啓動和初始化的時間大於邏輯處理的時間,造成資源浪費,甚至OOM。

爲此,當我們啓動一個任務,發現輸入數據量小但任務數量多時,需要注意在Map前端進行輸入合併。

當然,在我們向一個表寫數據時,也需要注意輸出文件大小

true

hive.merge.mapredfiles 

是否開啓合併 Map/Reduce 小文件,即是否在Map-Reduce的任務結束時合併小文件

false

hive.exec.parallel 

是否開啓 map/reduce job的併發提交。 

false

hive.limit.optimize.enable

當使用LIMIT語句時,其可以對數據源進行抽樣,避免執行整個查詢語句,然後再返回部分結果

但這個功能有個缺點,有可能輸入中有用的數據永遠不會被處理到。

hive.exec.reducers.bytes.per.reducer 

每一個 reducer 的平均負載字節數。 

1000000000   

hive.exec.reducers.max 

設置reducer個數的上限,可以阻止某個查詢消耗過多的reducer資源,對這個屬性值大小的設定,一個建議的計算公式如下:

(集羣總Reduce槽位個數*1.5) / (執行中查詢的平均個數)

1.5倍數是一個經驗係數,用於防止未充分利用集羣的情況。 
999

hive.exec.rowoffset

hive提供了2種虛擬列:一種用於將要進行劃分的輸入文件名,另一種用於文件中的塊內偏移量。

當hive產生了非預期的或null的返回結果時,可以通過這些虛擬列診斷查詢。通過這些“字段”,用戶可以查看到哪個文件甚至哪些數據導致出現問題:

SELECT 
INPUT_FILE_NAME,
BLOCK_OFFSET_INSIDE_FILE,
ROW_OFFSET_INSIDE_BLOCK,
line 
FROM hive_text 
WHERE line LIKE '%hive%' LIMIT 2;
true

hive.multigroupby.singlemr

一個特別的優化,是否將查詢中的多個group by操作組裝到單個MapReduce任務中。

false

hive.exec.dynamic.partition 

是否打開動態分區。 

false

hive.exec.dynamic.partition.mode 

打開動態分區後,動態分區的模式,有 strict 和 nonstrict 兩個值可選,strict 要求至少包含一個靜態分區列,nonstrict 則無此要求。 

strict    

hive.exec.max.dynamic.partitions 

所允許的最大的動態分區的個數。 

1000

hive.exec.max.dynamic.partitions.pernode 

單個 reduce 結點所允許的最大的動態分區的個數。 

100

hive.exec.default.partition.name 

默認的動態分區的名稱,當動態分區列爲''或者null時,使用此名稱。

'__HIVE_DEFAULT_PARTITION__'

hive.exec.mode.local.auto 

決定 Hive 是否應該自動地根據輸入文件大小,在本地運行(在GateWay運行) 

true

hive.exec.mode.local.auto.inputbytes.max 

如果 hive.exec.mode.local.auto 爲 true,當輸入文件大小小於此閾值時可以自動在本地模式運行,默認是 128M。 

134217728L

hive.exec.mode.local.auto.tasks.max 

如果 hive.exec.mode.local.auto 爲 true,當 Hive Tasks(Hadoop Jobs)小於此閾值時,可以自動在本地模式運行。 

4

hive.auto.convert.join 

是否根據輸入小表的大小,自動將 Reduce 端的 Common Join 轉化爲 Map Join,從而加快大表關聯小表的 Join 速度。 

false

hive.mapred.local.mem 

Mapper/Reducer 在本地模式的最大內存量,以字節爲單位,0爲不限制。 

0

hive.exec.scratchdir 

HDFS路徑,用於存儲不同 map/reduce 階段的執行計劃和這些階段的中間輸出結果。 

/tmp/<user.name>/hive    

hive.metastore.warehouse.dir 

Hive 默認的數據文件存儲路徑,通常爲 HDFS 可寫的路徑。 

"    

hive.groupby.skewindata 

決定 group by 操作是否支持傾斜的數據。 

false

hive.default.fileformat 

Hive 默認的輸出文件格式,與創建表時所指定的相同,可選項爲 'TextFile' 、 'SequenceFile' 或者 'RCFile'。 

'TextFile'

hive.security.authorization.enabled 

Hive 是否開啓權限認證。 

false    

hive.exec.plan 

Hive 執行計劃的路徑,會在程序中自動進行設置 

null   

hive.exec.submitviachild 

決定 map/reduce Job 是否應該使用各自獨立的 JVM 進行提交(Child進程),默認情況下,使用與 HQL compiler 相同的 JVM 進行提交。 

false    

hive.exec.script.maxerrsize 

通過 TRANSFROM/MAP/REDUCE 所執行的用戶腳本所允許的最大的序列化錯誤數。 

100000    

hive.exec.script.allow.partial.consumption 

是否允許腳本只處理部分數據,如果設置爲 true ,因 broken pipe 等造成的數據未處理完成將視爲正常。 

false    

hive.exec.compress.output 

決定查詢中最後一個 map/reduce job 的輸出是否爲壓縮格式。 

false    

hive.exec.compress.intermediate 

決定查詢的中間 map/reduce job (中間 stage)的輸出是否爲壓縮格式。 

false    

hive.intermediate.compression.codec 

中間 map/reduce job 的壓縮編解碼器的類名(一個壓縮編解碼器可能包含多種壓縮類型),該值可能在程序中被自動設置。     

hive.intermediate.compression.type 

中間 map/reduce job 的壓縮類型,如 "BLOCK" "RECORD"。    

hive.exec.pre.hooks 

語句層面,整條 HQL 語句在執行前的 hook 類名。 

"    

hive.exec.post.hooks 

語句層面,整條 HQL 語句在執行完成後的 hook 類名。         

hive.exec.parallel.thread.number 

併發提交時的併發線程的個數。 

8   

hive.mapred.reduce.tasks.speculative.execution 

是否開啓 reducer 的推測執行,與 mapred.reduce.tasks.speculative.execution 作用相同。 

false   

hive.exec.counters.pull.interval 

客戶端拉取 progress counters 的時間,以毫秒爲單位。 

1000L 

hadoop.bin.path 

Hadoop Client 可執行腳本的路徑,該路徑用於通過單獨的 JVM 提交 job,使用 Hadoop Client 的配置。 

$HADOOP_HOME/bin/hadoop    

hadoop.config.dir 

Hadoop Client 配置文件的路徑,使用 Hadoop Client 的配置。 

$HADOOP_HOME/conf    

fs.default.name 

Namenode 的 URL,使用 Hadoop Client 的配置。 

file:///    

map.input.file 

Map 的輸入文件,使用 Hadoop Client 的配置。 

null   

mapred.input.dir 

Map 的輸入目錄,使用 Hadoop Client 的配置。 

null  

mapred.input.dir.recursive 

輸入目錄是否可遞歸嵌套,使用 Hadoop Client 的配置。 

false   

mapred.job.tracker 

Job Tracker 的 URL,使用 Hadoop Client 的配置,如果這個配置設置爲 'local',將使用本地模式。 

local   

mapred.job.name 

Map/Reduce 的 job 名稱,如果沒有設置,則使用生成的 job name,使用 Hadoop Client 的配置。 

null   

mapred.reduce.tasks.speculative.execution 

Map/Reduce 推測執行,使用 Hadoop Client 的配置。 

null   

hive.metastore.metadb.dir 

Hive 元數據庫所在路徑。 

"    

hive.metastore.uris 

Hive 元數據的 URI,多個 thrift://地址,以英文逗號分隔。 

"    

hive.metastore.connect.retries 

連接到 Thrift 元數據服務的最大重試次數。 

3    

javax.jdo.option.ConnectionPassword 

JDO 的連接密碼。 

"    

hive.metastore.ds.connection.url.hook 

JDO 連接 URL Hook 的類名,該 Hook 用於獲得 JDO 元數據庫的連接字符串,爲實現了 JDOConnectionURLHook 接口的類。 

 "    

javax.jdo.option.ConnectionURL 

元數據庫的連接 URL。 

"   

hive.metastore.ds.retry.attempts 

當沒有 JDO 數據連接錯誤後,嘗試連接後臺數據存儲的最大次數。 

1   

hive.metastore.ds.retry.interval 

每次嘗試連接後臺數據存儲的時間間隔,以毫秒爲單位。 

1000    

hive.metastore.force.reload.conf 

是否強制重新加載元數據配置,一但重新加載,該值就會被重置爲 false。 

false  

hive.metastore.server.min.threads 

Thrift 服務線程池的最小線程數。 

8   

hive.metastore.server.max.threads 

Thrift 服務線程池的最大線程數。 

0x7fffffff   

hive.metastore.server.tcp.keepalive 

Thrift 服務是否保持 TCP 連接。 

true  

hive.metastore.archive.intermediate.original 

用於歸檔壓縮的原始中間目錄的後綴,這些目錄是什麼並不重要,只要能夠避免衝突即可。 

'_INTERMEDIATE_ORIGINAL' 

hive.metastore.archive.intermediate.archived 

用於歸檔壓縮的壓縮後的中間目錄的後綴,這些目錄是什麼並不重要,只要能夠避免衝突即可。 

'_INTERMEDIATE_ARCHIVED'    

hive.metastore.archive.intermediate.extracted 

用於歸檔壓縮的解壓後的中間目錄的後綴,這些目錄是什麼並不重要,只要能夠避免衝突即可。 

'_INTERMEDIATE_EXTRACTED'   

hive.cli.errors.ignore 

是否忽略錯誤,對於包含多的 SQL 文件,可以忽略錯誤的行,繼續執行下一行。 

false  

hive.session.id 

當前會話的標識符,格式爲“用戶名_時間”用於記錄在 job conf 中,一般不予以手動設置。 

"    

hive.session.silent 

當前會話是否在 silent 模式運行。 如果不是 silent 模式,所以 info 級打在日誌中的消息,都將以標準錯誤流的形式輸出到控制檯。

false   

hive.query.string 

當前正在被執行的查詢字符串。 

"    

hive.query.id 

當前正在被執行的查詢的ID。 

"    

hive.query.planid 

當前正在被執行的 map/reduce plan 的 ID。 

"    

hive.jobname.length 

當前 job name 的最大長度,hive 會根據此長度省略 job name 的中間部分。 

50    

hive.jar.path 

通過單獨的 JVM 提交 job 時,hive_cli.jar 所在的路徑 

"    

hive.aux.jars.path 

各種由用戶自定義 UDF 和 SerDe 構成的插件 jar 包所在的路徑。 

"   

hive.added.files.path 

ADD FILE 所增加的文件的路徑。 

"   

hive.added.jars.path 

ADD JAR 所增加的文件的路徑。 

"   

hive.added.archives.path 

ADD ARCHIEVE 所增加的文件的路徑。 

"   

hive.table.name 

當前的 Hive 表的名稱,該配置將通過 ScirptOperator 傳入到用戶腳本中。 

"    

hive.partition.name 

當前的 Hive 分區的名稱,該配置將通過 ScriptOperator 傳入到用戶腳本中。 

"    

hive.script.auto.progress 

腳本是否週期性地向 Job Tracker 發送心跳,以避免腳本執行的時間過長,使 Job Tracker 認爲腳本已經掛掉了。 

false    

hive.script.operator.id.env.var 

用於識別 ScriptOperator ID 的環境變量的名稱。 

'HIVE_SCRIPT_OPERATOR_ID'    

hive.alias 

當前的 Hive 別名,該配置將通過 ScriptOpertaor 傳入到用戶腳本中。 

"   

hive.map.aggr 

決定是否可以在 Map 端進行聚合操作 

true    

hive.join.emit.interval 

Hive Join 操作的發射時間間隔,以毫秒爲單位。 

1000   

hive.join.cache.size 

Hive Join 操作的緩存大小,以字節爲單位。 

25000    

hive.mapjoin.bucket.cache.size 

Hive Map Join 桶的緩存大小,以字節爲單位。 

100    

hive.mapjoin.size.key 

Hive Map Join 每一行鍵的大小,以字節爲單位。 

10000   

hive.mapjoin.cache.numrows 

Hive Map Join 所緩存的行數。 

25000    

hive.groupby.mapaggr.checkinterval 

對於 Group By 操作的 Map 聚合的檢測時間,以毫秒爲單位。 

100000  

hive.map.aggr.hash.percentmemory 

Hive Map 端聚合的哈稀存儲所佔用虛擬機的內存比例。 

0.5   

hive.map.aggr.hash.min.reduction 

Hive Map 端聚合的哈稀存儲的最小 reduce 比例。 

0.5    

hive.udtf.auto.progress 

Hive UDTF 是否週期性地報告心跳,當 UDTF 執行時間較長且不輸出行時有用。 

false    

hive.fileformat.check 

Hive 是否檢查輸出的文件格式。 

true    

hive.querylog.location 

Hive 實時查詢日誌所在的目錄,如果該值爲空,將不創建實時的查詢日誌。 

'/tmp/$USER'   

hive.script.serde 

Hive 用戶腳本的 SerDe。 

'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'    

hive.script.recordreader 

Hive 用戶腳本的 RecordRedaer。 

'org.apache.hadoop.hive.ql.exec.TextRecordReader'    

hive.script.recordwriter 

Hive 用戶腳本的 RecordWriter。 

'org.apache.hadoop.hive.ql.exec.TextRecordWriter'   

hive.hwi.listen.host 

HWI 所綁定的 HOST 或者 IP。 

'0.0.0.0'    

hive.hwi.listen.port 

HWI 所監聽的 HTTP 端口。 

9999    

hive.hwi.war.file 

HWI 的 war 文件所在的路徑。 

$HWI_WAR_FILE   

hive.test.mode 

是否以測試模式運行 Hive 

false    

hive.test.mode.prefix 

Hive 測試模式的前綴。 

'test_'    

hive.test.mode.samplefreq 

Hive 測試模式取樣的頻率,即每秒鐘取樣的次數。 

32   

hive.test.mode.nosamplelist 

Hive 測試模式取樣的排除列表,以逗號分隔。 

"    

hive.merge.size.per.task 

每個任務合併後文件的大小,根據此大小確定 reducer 的個數,默認 256 M。 

256000000    

hive.merge.smallfiles.avgsize 

需要合併的小文件羣的平均大小,默認 16 M。 

16000000    

hive.optimize.skewjoin 

是否優化數據傾斜的 Join,對於傾斜的 Join 會開啓新的 Map/Reduce Job 處理。 

false    

hive.skewjoin.key 

傾斜鍵數目閾值,超過此值則判定爲一個傾斜的 Join 查詢。 

1000000   

hive.skewjoin.mapjoin.map.tasks 

處理數據傾斜的 Map Join 的 Map 數上限。 

10000   

hive.skewjoin.mapjoin.min.split 

處理數據傾斜的 Map Join 的最小數據切分大小,以字節爲單位,默認爲32M。 

33554432   

mapred.min.split.size 

Map Reduce Job 的最小輸入切分大小,與 Hadoop Client 使用相同的配置。 

1    

hive.mergejob.maponly 

是否啓用 Map Only 的合併 Job。 

true   

hive.heartbeat.interval 

Hive Job 的心跳間隔,以毫秒爲單位。 

1000    

hive.mapjoin.maxsize 

Map Join 所處理的最大的行數。超過此行數,Map Join進程會異常退出。 

1000000   

hive.hashtable.initialCapacity 

Hive 的 Map Join 會將小表 dump 到一個內存的 HashTable 中,該 HashTable 的初始大小由此參數指定。 

100000   

hive.hashtable.loadfactor 

Hive 的 Map Join 會將小表 dump 到一個內存的 HashTable 中,該 HashTable 的負載因子由此參數指定。 

0.75    

hive.mapjoin.followby.gby.localtask.max.memory.usage 

MapJoinOperator後面跟隨GroupByOperator時,內存的最大使用比例 

0.55   

hive.mapjoin.localtask.max.memory.usage 

Map Join 的本地任務使用堆內存的最大比例 

0.9

hive.mapjoin.check.memory.rows 

設置每多少行檢測一次內存的大小,如果超過 hive.mapjoin.localtask.max.memory.usage 則會異常退出,Map Join 失敗。 

100000   

hive.debug.localtask 

是否調試本地任務,目前該參數沒有生效 

false   

hive.task.progress 

是否開啓 counters ,以記錄 Job 執行的進度,同時客戶端也會拉取進度 counters。 

false    
hive.input.format 

Hive 的輸入 InputFormat。 

默認是org.apache.hadoop.hive.ql.io.HiveInputFormat,其他還有org.apache.hadoop.hive.ql.io.CombineHiveInputFormat    

hive.enforce.bucketing 

是否啓用強制 bucketing。 

false    

hive.enforce.sorting 

是否啓用強制排序。 

false   

hive.mapred.partitioner 

Hive 的 Partitioner 類。 

'org.apache.hadoop.hive.ql.io.DefaultHivePartitioner'    

hive.exec.script.trust 

Hive Script Operator For trust 

false    
hive.hadoop.supports.splittable.combineinputformat 

是否支持可切分的 CombieInputFormat 

false    
hive.optimize.cp 

是否優化列剪枝。 

true    
hive.optimize.ppd 

是否優化謂詞下推。 

true    
hive.optimize.groupby 

是否優化 group by。 

true    
hive.optimize.bucketmapjoin 

是否優化 bucket map join。 

false   
hive.optimize.bucketmapjoin.sortedmerge 

是否在優化 bucket map join 時嘗試使用強制 sorted merge bucket map join。 

false    
hive.optimize.reducededuplication 

是否優化 reduce 冗餘。 

true    
hive.hbase.wal.enabled 

是否開啓 HBase Storage Handler。 

true   
hive.archive.enabled 

是否啓用 har 文件。 

false   

hive.archive.har.parentdir.settable 

是否啓用 har 文件的父目錄可設置。 

false   

hive.outerjoin.supports.filters 

是否啓動外聯接支持過濾條件。 

true   

hive.fetch.output.serde 

對於 Fetch Task 的 SerDe 類 

'org.apache.hadoop.hive.serde2.DelimitedJSONSerDe'   
hive.semantic.analyzer.hook 

Hive 語義分析的 Hook,在語義分析階段的前後被調用,用於分析和修改AST及生成的執行計劃,以逗號分隔。 

null   
hive.cli.print.header 

是否顯示查詢結果的列名,默認爲不顯示。 

false    

hive.cli.encoding 

Hive 默認的命令行字符編碼。 

'UTF8'    

hive.log.plan.progress 

是否記錄執行計劃的進度。 

true   
hive.exec.script.wrapper 
Script Operator 腳本調用的封裝,通常爲腳本解釋程序。例如,可以把該變量值的名稱設置爲"python",那麼傳遞到 Script Operator 的腳本將會以"python <script command>"的命令形式進行調用,如果這個值爲null或者沒有設置,那麼該腳本將會直接以"<script command>"的命令形式調用。 
null



參考資料《Hive編程指南》  及  各種網絡蒐集資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章