主要功能 | hive配置參數(shù) | 作用 | 默認值 | 應(yīng)用場景 |
---|---|---|---|---|
并發(fā) | hive.exec.parallel=true; | 多job并發(fā) | ||
hive.exec.parallel.thread.numbe=X; | 可以并行化的job數(shù) | 8 | ||
輸入合并小文件 | hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; | 執(zhí)行Map前進行小文件合并贸桶。一個data node節(jié)點上多個小文件會進行合并蚀瘸,合并文件數(shù)由mapred.max.split.size限制的大小決定。 | ||
hive.hadoop.supports.splittable.combineinputformat = true; | 是否支持可切分的 CombieInputFormat | FALSE | ||
小文件 | mapreduce.job.split.metainfo.maxsize=-1 | java.io.IOException:Split metadata size exceeded 10000000涵防,小文件過多 | ||
mapreduce.jobtracker.split.metainfo.maxsize = -1 | ||||
mapreduce.job.running.map.limit=50000; | map數(shù)超過50000的job設(shè)置: | |||
map數(shù) | mapred.min.split.size = X; | 每個Map最小輸入大小 | ||
mapred.max.split.size=X; | 每個Map最大輸入大小 | |||
mapred.min.split.size.per.node=100000000; | 一個節(jié)點上(datanode)split至少的大小蝇恶, | |||
mapred.min.split.size.per.rack=100000000; | 同一個交換機(rack locality)下split至少的大小 | |||
mapreduce.input.fileinputformat.split.maxsize = 256000000; | mapred代表的是hadoop舊API羡鸥,而mapreduce代表的是hadoop新的API咬摇。 | |||
mapreduce.input.fileinputformat.split.minsize.per.node=256000000; | ||||
mapreduce.input.fileinputformat.split.minsize.per.rack=256000000; | ||||
reduce數(shù) | hive.exec.reducers.bytes.per.reducer = X; | 每個reducer處理的文件大小儡陨,默認是1GB,調(diào)整reduce數(shù)目 | 100000000 | 生成的文件大小辙售,設(shè)置每個reducer處理的數(shù)據(jù)hive.exec.reducers.bytes.per.reducer=5120000000; insert into table xxx select * from xxx distribute by rand();備注: 設(shè)置的參數(shù)是生成的文件大小轻抱,distribute by rand()保證數(shù)據(jù)的平均大小是512Mb。 |
hive.exec.reducers.max | 控制最大的reducer的數(shù)量圾亏, 如果 input / bytes per reduce >max 則會啟動這個參數(shù)所指定的reduce個數(shù)十拣。 這個并不會影響mapre.reduce.tasks參數(shù)的設(shè)置封拧。默認的max是999 | 999 | ||
hive.mapred.reduce.tasks | 這個參數(shù)如果指定了志鹃,hive就不會用它的estimation函數(shù)來自動計算reduce的個數(shù),而是用這個參數(shù)來啟動reducer泽西。默認是-1(reduce的個數(shù)設(shè)置其實對執(zhí)行效率有很大的影響:1)曹铃、如果reduce太少: 如果數(shù)據(jù)量很大,會導(dǎo)致這個reduce異常的慢捧杉,從而導(dǎo)致這個任務(wù)不能結(jié)束陕见,也有可能會OOM 2)秘血、如果reduce太多: 產(chǎn)生的小文件太多,合并起來代價太高评甜,namenode的內(nèi)存占用也會增大灰粮。如果我們不指定mapred.reduce.tasks,hive會自動計算需要多少個reducer忍坷。計算的公式: reduce個數(shù) = InputFileSize / bytes per reducer 3)粘舟、估算reducer的個數(shù),及計算公式:注意最重要的一句話:int reducers = (int)((totalInputFileSize +bytesPerReducer - 1) / bytesPerReducer)) | 生成的文件個數(shù)佩研。設(shè)置reduce個數(shù) mapred.reduce.tasks=50; insert into table xxx select * from xxx distribute by rand();備注: 設(shè)置的參數(shù)是生成的文件個數(shù)柑肴,distribute by rand()保證數(shù)據(jù)隨機分配到50個文件中。 | ||
輸出合并小文件 | hive.merge.mapredfiles = true | 正常的map-reduce job后旬薯,是否啟動merge job來合并reduce端輸出的結(jié)果晰骑,建議開啟 | ||
hive.merge.mapfiles = true; | 正常的map-only job后,是否啟動merge job來合并map端輸出的結(jié)果 | |||
hive.merge.size.per.task = X; | 合并后文件的大小 | |||
hive.merge.smallfiles.avgsize=X; | 當(dāng)輸出文件平均大小小于該值绊序,啟動新job合并文件 | -1 | ||
輸出壓縮 | mapred.output.compress=true; | 壓縮輸出 | ||
hive.exec.compress.output=true; | 為最終輸出結(jié)果啟用壓縮 | |||
mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec; | 輸出所用的壓縮codec 常見的壓縮格式:DEFLATE org.apache.hadoop.io.compress.DefaultCodec gzip org.apache.hadoop.io.compress.GzipCodec bzip org.apache.hadoop.io.compress.BZip2Codec Snappy org.apache.hadoop.io.compress.SnappyCodec | org.apache.hadoop.io.compress.DefaultCodec | ||
mapred.output.compression.type=BLOCK; | 控制限制使用壓縮格式,默認值為RECORD, 即對每一條記錄進行壓縮, 如果將其改為BLOCK,將針對一組記錄進行壓縮SqeuenceFile的輸出可以使用的壓縮類型:NONE,RECORD,BLOCK | RECORD | ||
中間過程壓縮 | hive.exec.compress.intermediate=true; | 為map中間輸出啟用壓縮硕舆。 | ||
mapred.map.output.compression.codec=com.hadoop.compression.lzo.LzoCodec; | 一般對于中間輸出壓縮采用低壓縮比,高壓縮解壓縮速度的壓縮算法骤公,如LZO,Snappy | org.apache.hadoop.io.compress.DefaultCodec | ||
hive.intermediate.compression.type=BLOCK; | RECORD | |||
動態(tài)分區(qū) | hive.exec.max.created.files=100000; | 動態(tài)分區(qū)屬性,全局可以創(chuàng)建的最大文件個數(shù) | 100000 | |
hive.exec.dynamic.partition.mode = nonstrict; | 動態(tài)分區(qū)的模式岗宣,默認strict,表示必須指定至少一個分區(qū)為靜態(tài)分區(qū)淋样,nonstrict模式表示允許所有的分區(qū)字段都可以使用動態(tài)分區(qū)耗式。一般需要設(shè)置為nonstrict | strict | ||
hive.exec.dynamic.partition = true; | 是否開啟動態(tài)分區(qū)功能,默認false關(guān)閉趁猴。使用動態(tài)分區(qū)時候刊咳,該參數(shù)必須設(shè)置成true; | FALSE | ||
hive.exec.max.dynamic.partitions.pernode | 在每個執(zhí)行MR的節(jié)點上,最大可以創(chuàng)建多少個動態(tài)分區(qū)儡司。該參數(shù)需要根據(jù)實際的數(shù)據(jù)來設(shè)定娱挨。比如:源數(shù)據(jù)中包含了一年的數(shù)據(jù),即day字段有365個值捕犬,那么該參數(shù)就需要設(shè)置成大于365跷坝,如果使用默認值100,則會報錯碉碉。 | 100 | ||
hive.exec.max.dynamic.partitions | 在所有執(zhí)行MR的節(jié)點上柴钻,最大一共可以創(chuàng)建多少個動態(tài)分區(qū)。 | |||
hive.error.on.empty.partition | 當(dāng)有空分區(qū)生成時垢粮,是否拋出異常贴届。一般不需要設(shè)置。 | FALSE | ||
groupby負載均衡 | hive.groupby.skewindata=true; | 負載均衡(一般不建議使用,會有丟數(shù)據(jù)的風(fēng)險)數(shù)據(jù)傾斜時負載均衡毫蚓,當(dāng)選項設(shè)定為true占键,生成的查詢計劃會有兩個MRJob。第一個MRJob 中元潘,Map的輸出結(jié)果集合會隨機分布到Reduce中畔乙,每個Reduce做部分聚合操作,并輸出結(jié)果翩概,這樣處理的結(jié)果是相同的GroupBy Key有可能被分發(fā)到不同的Reduce中啸澡,從而達到負載均衡的目的;第二個MRJob再根據(jù)預(yù)處理的數(shù)據(jù)結(jié)果按照GroupBy Key分布到Reduce中(這個過程可以保證相同的GroupBy Key被分布到同一個Reduce中)氮帐,最后完成最終的聚合操作嗅虏。 | ||
hive.groupby.mapaggr.checkinterval=100000; | group的鍵對應(yīng)的記錄條數(shù)超過這個值則會進行分拆,值根據(jù)具體數(shù)據(jù)量設(shè)置 | |||
查看 | hive.stats.dbclass=counter; | 存儲臨時Hive統(tǒng)計信息的方式 | ||
dfs.block.size; | 查看集群設(shè)置的文件塊大小,不能修改上沐,值為134217728皮服,即128mb。 | |||
io.compression.codecs; | 查看集群的支持的壓縮算法.org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.SnappyCodec | |||
數(shù)據(jù)傾斜優(yōu)化 | hive.auto.convert.join=true | /+mAPJOIN(小表名)/ 小表加載到內(nèi)存中参咙,表的JOIN操作是在Map端且在內(nèi)存進行的 | FALSE | 大表 join 小表 |
hive.optimize.skewjoin=true | join過程出現(xiàn)傾斜則優(yōu)化 | |||
hive.skewjoin.key=1000000 | join的鍵對應(yīng)的記錄條數(shù)超過這個值則會進行優(yōu)化 | |||
作業(yè) | mapreduce.job.name | 作業(yè)名稱 | ||
mapreduce.job.priority | 作業(yè)優(yōu)先級龄广,VERY_HIGH,HIGH,NORMAL,LOW,VERY_LOW | NORMAL | ||
MR ApplicationMaster設(shè)置 | yarn.app.mapreduce.am.resource.mb | MR ApplicationMaster占用的內(nèi)存量 | 1536 | |
yarn.app.mapreduce.am.resource.cpu-vcores | MR ApplicationMaster占用的虛擬CPU個數(shù) | 1 | ||
mapreduce.am.max-attempts | MR ApplicationMaster最大失敗嘗試次數(shù) | 2 | ||
Map Task | mapreduce.map.memory.mb | 每個Map Task需要的內(nèi)存量 | 1024 | MAP YARN 申請內(nèi)存 4096 |
mapreduce.map.cpu.vcores | 每個Map Task需要的虛擬CPU個數(shù) | 1 | ||
mapreduce.map.maxattempts | Map Task最大失敗嘗試次數(shù) | 4 | ||
Reduce Task | mapreduce.reduce.memory.mb | 每個Reduce Task需要的內(nèi)存量 | 1024 | REDUCE YARN 申請內(nèi)存 |
mapreduce.reduce.cpu.vcores | 每個Reduce Task需要的虛擬CPU個數(shù) | 1 | ||
mapreduce.reduce.maxattempts | Reduce Task最大失敗嘗試次數(shù) | 4 | ||
mapreduce.map.speculative | 是否對Map Task啟用推測執(zhí)行機制 | FALSE | ||
mapreduce.reduce.speculative | 是否對Reduce Task啟用推測執(zhí)行機制 | FALSE | ||
mapreduce.map.sort.spill.percent | Map階段溢寫文件的閾值(排序緩沖區(qū)大小的百分比) | 0.8 | ||
mapreduce.reduce.shuffle.parallelcopies | Reduce Task啟動的并發(fā)拷貝數(shù)據(jù)的線程數(shù)目 | 5 | ||
隊列 | mapreduce.job.queuename | 作業(yè)提交到的隊列 | default | |
io | mapreduce.task.io.sort.mb | 任務(wù)內(nèi)部排序緩沖區(qū)大小 | 100 | |
io.sort.mb = X; | map輸出緩沖區(qū)大小 | 100 | ||
io.sort.factor = X; | map端或reduce端排序文件時,每次對多合并流數(shù),默認值為10 | 10 | ||
yarn | yarn.app.mapreduce.am.command-opts=-Xmx8192m | beyond virtual memory limits | ||
yarn.app.mapreduce.am.resource.mb=9216 | ||||
JVM | mapreduce.map.java.opts=-Xmx3572M; | 一般 JVM 參數(shù)可以是 Yarn 申請內(nèi)存的 80%, 如果 都比較大蕴侧,可以酌情 | MAP JVM 內(nèi)存 | |
mapreduce.reduce.java.opts=-Xmx4096M; | REDUCE JVM 內(nèi)存 | |||
yarn.app.mapreduce.am.resource.mb=2000; | AM YARN 申請內(nèi)存 | |||
yarn.app.mapreduce.am.command-opts=-Xmx1524m; | AM JVM 內(nèi)存 | |||
矢量查詢(Vectorized query) | hive.vectorized.execution.enabled = true; | 每次處理數(shù)據(jù)時會將1024行數(shù)據(jù)組成一個batch進行處理择同,而不是一行一行進行處理,這樣能夠顯著提高執(zhí)行速度净宵。 | ||
hive.vectorized.execution.reduce.enabled = true; | ||||
TEZ | hive.execution.engine=tez; | Tez 是一個開源的支持DAG作業(yè)的計算框架敲才,它來源于MapReduce框架。 | ||
set hive.mapjoin.hybridgrace.hashtable=false | Hive2.1.0的版本有一個BUG择葡。使用Tez的時候需要設(shè)置 | |||
COST BASED QUERY OPTIMIZATION | set hive.cbo.enable=true; | COST BASED QUERY OPTIMIZATION可以優(yōu)化hive的每次查詢紧武。如果我們想要使用CBO,需要通過HIVE的分析模式來收集表的不同統(tǒng)計數(shù)據(jù)敏储,我們可以通過下面的命令來進行:analyze table tweets compute statistics for columns; | ||
set hive.compute.query.using.stats=true; | ||||
set hive.stats.fetch.column.stats=true; | ||||
set hive.stats.fetch.partition.stats=true; |
資料:
https://zh.hortonworks.com/blog/5-ways-make-hive-queries-run-faster/
Hive官網(wǎng):https://cwiki.apache.org/confluence/display/Hive/AdminManual+Configuration
Hadoop官網(wǎng):http://hadoop.apache.org/docs/current/
set -v; 查看hive的所有默認配置阻星。