主要功能

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的所有默认配置。