主要功能 | hive配置参数 | 作用 | 默认值 | 应用场景 |
---|---|---|---|---|
并发 | hive.exec.parallel=true; | 多job并发 | ||
hive.exec.parallel.thread.numbe=X; | 可以并行化的job数 | 8 | ||
输入合并小文件 | hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; | 执行Map前进行小文件合并。一个data node节点上多个小文件会进行合并,合并文件数由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数超过50000的job设置: | |||
map数 | mapred.min.split.size = X; | 每个Map最小输入大小 | ||
mapred.max.split.size=X; | 每个Map最大输入大小 | |||
mapred.min.split.size.per.node=100000000; | 一个节点上(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数 | hive.exec.reducers.bytes.per.reducer = X; | 每个reducer处理的文件大小,默认是1GB,调整reduce数目 | 100000000 | 生成的文件大小,设置每个reducer处理的数据hive.exec.reducers.bytes.per.reducer=5120000000; insert into table xxx select * from xxx distribute by rand();备注: 设置的参数是生成的文件大小,distribute by rand()保证数据的平均大小是512Mb。 |
hive.exec.reducers.max | 控制最大的reducer的数量, 如果 input / bytes per reduce >max 则会启动这个参数所指定的reduce个数。 这个并不会影响mapre.reduce.tasks参数的设置。默认的max是999 | 999 | ||
hive.mapred.reduce.tasks | 这个参数如果指定了,hive就不会用它的estimation函数来自动计算reduce的个数,而是用这个参数来启动reducer。默认是-1(reduce的个数设置其实对执行效率有很大的影响:1)、如果reduce太少: 如果数据量很大,会导致这个reduce异常的慢,从而导致这个任务不能结束,也有可能会OOM 2)、如果reduce太多: 产生的小文件太多,合并起来代价太高,namenode的内存占用也会增大。如果我们不指定mapred.reduce.tasks,hive会自动计算需要多少个reducer。计算的公式: reduce个数 = InputFileSize / bytes per reducer 3)、估算reducer的个数,及计算公式:注意最重要的一句话:int reducers = (int)((totalInputFileSize +bytesPerReducer - 1) / bytesPerReducer)) | 生成的文件个数。设置reduce个数 mapred.reduce.tasks=50; insert into table xxx select * from xxx distribute by rand();备注: 设置的参数是生成的文件个数,distribute by rand()保证数据随机分配到50个文件中。 | ||
输出合并小文件 | hive.merge.mapredfiles = true | 正常的map-reduce job后,是否启动merge job来合并reduce端输出的结果,建议开启 | ||
hive.merge.mapfiles = true; | 正常的map-only job后,是否启动merge job来合并map端输出的结果 | |||
hive.merge.size.per.task = X; | 合并后文件的大小 | |||
hive.merge.smallfiles.avgsize=X; | 当输出文件平均大小小于该值,启动新job合并文件 | -1 | ||
输出压缩 | mapred.output.compress=true; | 压缩输出 | ||
hive.exec.compress.output=true; | 为最终输出结果启用压缩 | |||
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 | |||
动态分区 | hive.exec.max.created.files=100000; | 动态分区属性,全局可以创建的最大文件个数 | 100000 | |
hive.exec.dynamic.partition.mode = nonstrict; | 动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区。一般需要设置为nonstrict | strict | ||
hive.exec.dynamic.partition = true; | 是否开启动态分区功能,默认false关闭。使用动态分区时候,该参数必须设置成true; | FALSE | ||
hive.exec.max.dynamic.partitions.pernode | 在每个执行MR的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错。 | 100 | ||
hive.exec.max.dynamic.partitions | 在所有执行MR的节点上,最大一共可以创建多少个动态分区。 | |||
hive.error.on.empty.partition | 当有空分区生成时,是否抛出异常。一般不需要设置。 | FALSE | ||
groupby负载均衡 | hive.groupby.skewindata=true; | 负载均衡(一般不建议使用,会有丢数据的风险)数据倾斜时负载均衡,当选项设定为true,生成的查询计划会有两个MRJob。第一个MRJob 中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的GroupBy Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MRJob再根据预处理的数据结果按照GroupBy Key分布到Reduce中(这个过程可以保证相同的GroupBy Key被分布到同一个Reduce中),最后完成最终的聚合操作。 | ||
hive.groupby.mapaggr.checkinterval=100000; | group的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置 | |||
查看 | hive.stats.dbclass=counter; | 存储临时Hive统计信息的方式 | ||
dfs.block.size; | 查看集群设置的文件块大小,不能修改,值为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 | |||
数据倾斜优化 | hive.auto.convert.join=true | /+mAPJOIN(小表名)/ 小表加载到内存中,表的JOIN操作是在Map端且在内存进行的 | FALSE | 大表 join 小表 |
hive.optimize.skewjoin=true | join过程出现倾斜则优化 | |||
hive.skewjoin.key=1000000 | join的键对应的记录条数超过这个值则会进行优化 | |||
作业 | mapreduce.job.name | 作业名称 | ||
mapreduce.job.priority | 作业优先级,VERY_HIGH,HIGH,NORMAL,LOW,VERY_LOW | NORMAL | ||
MR ApplicationMaster设置 | yarn.app.mapreduce.am.resource.mb | MR ApplicationMaster占用的内存量 | 1536 | |
yarn.app.mapreduce.am.resource.cpu-vcores | MR ApplicationMaster占用的虚拟CPU个数 | 1 | ||
mapreduce.am.max-attempts | MR ApplicationMaster最大失败尝试次数 | 2 | ||
Map Task | mapreduce.map.memory.mb | 每个Map Task需要的内存量 | 1024 | MAP YARN 申请内存 4096 |
mapreduce.map.cpu.vcores | 每个Map Task需要的虚拟CPU个数 | 1 | ||
mapreduce.map.maxattempts | Map Task最大失败尝试次数 | 4 | ||
Reduce Task | mapreduce.reduce.memory.mb | 每个Reduce Task需要的内存量 | 1024 | REDUCE YARN 申请内存 |
mapreduce.reduce.cpu.vcores | 每个Reduce Task需要的虚拟CPU个数 | 1 | ||
mapreduce.reduce.maxattempts | Reduce Task最大失败尝试次数 | 4 | ||
mapreduce.map.speculative | 是否对Map Task启用推测执行机制 | FALSE | ||
mapreduce.reduce.speculative | 是否对Reduce Task启用推测执行机制 | FALSE | ||
mapreduce.map.sort.spill.percent | Map阶段溢写文件的阈值(排序缓冲区大小的百分比) | 0.8 | ||
mapreduce.reduce.shuffle.parallelcopies | Reduce Task启动的并发拷贝数据的线程数目 | 5 | ||
队列 | mapreduce.job.queuename | 作业提交到的队列 | default | |
io | mapreduce.task.io.sort.mb | 任务内部排序缓冲区大小 | 100 | |
io.sort.mb = X; | map输出缓冲区大小 | 100 | ||
io.sort.factor = X; | map端或reduce端排序文件时,每次对多合并流数,默认值为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 参数可以是 Yarn 申请内存的 80%, 如果 都比较大,可以酌情 | MAP JVM 内存 | |
mapreduce.reduce.java.opts=-Xmx4096M; | REDUCE JVM 内存 | |||
yarn.app.mapreduce.am.resource.mb=2000; | AM YARN 申请内存 | |||
yarn.app.mapreduce.am.command-opts=-Xmx1524m; | AM JVM 内存 | |||
矢量查询(Vectorized query) | hive.vectorized.execution.enabled = true; | 每次处理数据时会将1024行数据组成一个batch进行处理,而不是一行一行进行处理,这样能够显著提高执行速度。 | ||
hive.vectorized.execution.reduce.enabled = true; | ||||
TEZ | hive.execution.engine=tez; | Tez 是一个开源的支持DAG作业的计算框架,它来源于MapReduce框架。 | ||
set hive.mapjoin.hybridgrace.hashtable=false | Hive2.1.0的版本有一个BUG。使用Tez的时候需要设置 | |||
COST BASED QUERY OPTIMIZATION | set hive.cbo.enable=true; | COST BASED QUERY OPTIMIZATION可以优化hive的每次查询。如果我们想要使用CBO,需要通过HIVE的分析模式来收集表的不同统计数据,我们可以通过下面的命令来进行: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官网:https://cwiki.apache.org/confluence/display/Hive/AdminManual+Configuration
Hadoop官网:http://hadoop.apache.org/docs/current/
set -v; 查看hive的所有默认配置。