1. SerDes and I/O
-
hive.input.format
默认 org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
默认的input format。如果 CombineHiveInputFormat 有问题,则使用 HiveInputFormat -
hive.default.fileformat
默认值 TextFile
可选项:TextFile,SequenceFile,RCfile,ORC,Parquet
Parquet是在2.3.0之后才有的,其他都在1.0之前就有了 -
hive.query.result.fileformat
默认值 TextFile(Hive2.0及以前),SequenceFile(Hive2.1及以上版本)
查询中间结果的文件格式
2. index相关参数
2.1 常调整参数(需熟悉并且自己试验一下, OK)
-
hive.optimize.index.filter
默认值: false
是否自动使用索引 -
hive.optimize.index.groupby
默认值:false
是否使用聚集索引优化group-by查询 -
hive.index.compact.binary.search
默认值:true
在索引表中是否开启二分搜索进行索引项查询,默认是true -
hive.exec.concatenate.check.index
默认值: true
这个参数设置为true, 当使用 alter table ... concatenate on... 的时候,如果表有索引hive会报错。可以帮助用户避免index的删除和重建 -
hive.optimize.index.autoupdate
默认值:false
是否在索引过期时启用自动重建。 注意:重新构建索引可能是一项耗时且计算昂贵的操作;在许多情况下,最好是手动重新构建索引。
2.2 了解即可
-
hive.index.compact.file.ignore.hdfs
默认值: false
这个参数设置为 true 的时候任务运行时索引中存储的HDFS地址将被忽略,如果数据被删除或者名字变化,索引依然还可以用 -
hive.optimize.index.filter.compact.minsize
默认值:5368709120 (5g)
压缩索引自动应用的最小输入大小 -
hive.optimize.index.filter.compact.maxsize
默认值:-1
压缩索引自动应用的最大输入大小,负值代表无穷大 -
hive.index.compact.query.max.size
默认值:10737418240 (10G)
一个使用压缩索引的查询可以读入的最大数据量,负值代表无穷大 -
hive.index.compact.query.max.entries
默认值:10000000
使用压缩索引查询时能读到的最大索引项数,默认是10000000;负值代表无穷大;
3. orc文件格式相关参数
3.1 常调整参数(需熟悉并且自己试验一下,OK)
-
hive.orc.splits.include.file.footer
默认值 false
这个值如果打开,ORC文件中将包含stripes的元数据,这个数据远程读取(从客户端或者HiveServer2机器上)并且发送到所有的task -
hive.orc.cache.stripe.details.size
默认值 10000
ORC文件的元数据信息在客户端缓存时可缓存的大小 -
hive.orc.compute.splits.num.threads
默认值 10
ORC并行创建 splits 时的最大线程 -
hive.exec.orc.split.strategy
默认HYBRID,可选: HYBRID, BI, ETL,从 HIVE 1.2.0 版本开始出现。(环境为hive1.1.0, 试验不了)不是用户级配置
(1) HYBRID: 当文件的平均大小大于orc最大split值(默认256M)时使用ETL策略,否则使用BI策略。
(2) BI: 这种策略不会花费太多时间进行切分orc文件,不会去读orc的footer元数据,以文件为单位进行切片
(3) ETL: 这种策略会将文件进行切分,多个stripe组成一个split -
hive.exec.orc.zerocopy
默认值为 false
使用零拷贝读取ORC。(这需要Hadoop 2.3或更高版本。公司环境hadoop是2.6的) -
hive.merge.orcfile.stripe.level
默认值: true
当参数 hive.merge.mapfiles,hive.merge.mapredfiles 或者 hive.merge.tezfiles打开时,这个参数设置为 true的时候会从 stripe 层对 ORC文件进行快速合并。
3.2 不常调整参数
需知道
-
hive.exec.orc.default.stripe.size
默认值: HIVE0.14之后改成了64*1024*1024
默认的ORC stripe大小 -
hive.exec.orc.default.block.size
默认值: 256*1024*1024
orc文件的默认block大小 -
hive.exec.orc.default.row.index.stride
默认值 10000
orc文件中行组的行数 -
hive.exec.orc.default.block.padding
默认值 true
默认块填充。(orc文件的stripe和HDFS的文件块边界应该有填充) -
hive.exec.orc.block.padding.tolerance
默认值:0.05
填充的时候能填充空间占orc stripe大小的最大比例,例如stripe默认64M,则填充空间最大达到3.2M,如果超过这个数会用一个新的较小的stripe填进去。 -
hive.exec.orc.default.compress
默认值 ZLIB
orc文件默认压缩格式 -
hive.exec.orc.encoding.strategy
默认值 SPEED
可选项为 SPEED 和 COMPRESSION,只会影响整数的轻量级压缩,不会影响二级压缩如ZLIB -
hive.exec.orc.compression.strategy
默认值 SPEED
可选项为 SPEED 和 COMPRESSION,影响二级压缩如ZLIB -
hive.orc.row.index.stride.dictionary.check
默认值: true
这个参数设置为true的时候会进行行组级别的check,否则会进行stripe级别的check
了解即可
-
hive.exec.orc.memory.pool
默认值 0.5
ORC文件写入时可以使用的堆内存的占比 -
hive.exec.orc.base.delta.ratio
默认值 8
根据 STRIPE_SIZE 和 BUFFER_SIZE 定义的基本写入器和增量写入器的比例。 -
hive.exec.orc.default.buffer.size
默认值:256*1024
默认ORC缓冲大小 -
hive.exec.orc.dictionary.key.size.threshold
默认值 0.8 -
hive.orc.cache.use.soft.references
默认值 false
缓存orc文件的footer所用的对象是hard refernce(强引用,不会被垃圾回收器回收)。将这个参数设置为true可以防止内存资源紧缺时候发生内存溢出,代价是可能会隐性查询性能。 -
hive.exec.orc.skip.corrupt.data
默认值:false
设置为false的时候碰到损坏的数据将抛出异常
4. Reducer相关参数
4.1 常调整参数(需熟悉并且自己试验一下,OK)
-
mapred.reduce.tasks
默认值 -1。
每一个 job 默认的 reduce task 的数量,通常设置为接近可用主机数量的素数,当把参数 mapred.job.tracker 设置为 local 的时候这个参数被忽略。Hadoop中这个参数默认为1,但是hive通过将这个值默认为 -1,自动计算出 reduce task 的数量。 ---自动计算的依据? -
hive.exec.reducers.bytes.per.reducer
Hive 0.14.0 之后默认值为 256M,指的是每一个reducer的数据输入量。 -
hive.exec.reducers.max
Hive 0.14.0 之后默认值为 1009,指的是reducer数量的上限。
计算reducer的方式 N=min(hive.exec.reducers.max,总输入数据量/hive.exec.reducers.bytes.per.reducer)
5. Mapper相关参数
5.1 常调整参数(需熟悉并且自己试验一下, OK)
在 hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat下,切片大小由下面这些参数决定
计算公式 splitSize = Math.max(minSize, Math.min(maxSize, blockSize))
-
set dfs.block.size
默认值134217728;
非用户参数,默认 128M,HDFS文件块的大小 -
set mapred.min.split.size
默认值 1;
切片最小size -
set mapred.max.split.size
默认值 134217728;
切片最大size -
hive.hadoop.supports.splittable.combineinputformat
默认值 false;
输入的小文件是否合并为一个Mapper,这样能少起一些Mapper
在 hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat下,切片大小由下面这些参数决定
一般来说这四个参数的配置结果大小要满足如下关系: max.split.size >= min.split.size >= min.size.per.node >= min.size.per.rack
- set mapred.max.split.size=256000000; --- 调大的时候会减少Mapper数
- set mapred.min.split.size=10000000; --- 感觉没啥效果
- set mapred.min.split.size.per.node=256000000; --每个节点处理的最小split。不能比 mapred.max.split.size,会报错
- set mapred.min.split.size.per.rack=256000000; --每个机架处理的最小slit。不能比 mapred.max.split.size,会报错
试验效果:per.node 和 per.rack 进行设置后,Mapper 数减少,运行速度变快
6. 合并小文件
6.1 常调整参数(需熟悉并且自己试验一下, OK)
-
hive.hadoop.supports.splittable.combineinputformat
默认值 false,Hive2.0.0 之后去除
是否合并小文件 -
hive.merge.mapfiles
默认值:true
在只有map的作业结束时合并小文件 -
hive.merge.mapredfiles
默认值:false
在一个map/reduce作业结束后合并小文件 -
hive.merge.size.per.task
默认值:256000000
作业结束时合并文件的大小 -
hive.merge.smallfiles.avgsize
默认值:16000000
在作业输出文件小于该值时,起一个额外的map/reduce作业将小文件合并为大文件,小文件的基本阈值,设置大点可以减少小文件个数,需要mapfiles和mapredfiles为true
7. 聚合相关参数
7.1 常调整参数(需熟悉并且自己试验一下,OK)
-
hive.map.aggr
Hive 0.2 起默认值 false
在 group by 查询中是否进行 map端的预聚合 -
hive.groupby.mapaggr.checkinterval
默认值:100000
聚合操作时,聚合条数超过这个值的时候会分拆。 -
hive.map.aggr.hash.min.reduction
默认值:0.5
如果hash table的大小和输入行数的比例大于这个值,则hash聚合会被关掉 -
hive.groupby.skewindata
默认值false
数据是否有倾斜,优化 group by 查询 -
hive.optimize.groupby
默认值:true
对分桶表(分区)是否启用桶group by
7.2 了解即可
-
hive.multigroupby.singlereducer
默认值:true
多重插入时如果group by 的字段相同,只产生一个 MR job -
hive.map.aggr.hash.force.flush.memory.threshold
默认值:0.9
map端聚合hash表所用的最大内存,当内存使用高于这个数的时候强制刷数据。 -
hive.map.aggr.hash.percentmemory
默认值:0.5
map端聚合操作的hash table占总内存的比
8. join相关参数
8.1 常调整参数(需熟悉并且自己试验一下,OK)
-
hive.smalltable.filesize / hive.mapjoin.smalltable.filesize
默认值:25000000
输入表文件的mapjoin阈值,如果输入文件的大小小于该值,则试图将普通join转化为mapjoin -
hive.auto.convert.join
默认值:hive 0.11.0以上版本为 true
根据输入文件的大小决定是否将普通join转换为mapjoin的一种优化 -
hive.auto.convert.join.noconditionaltask
默认值:true
是否启用基于输入文件的大小,将普通连接转化为Map连接的优化机制。假设参与连接的表(或分区)有N个,如果打开这个 参数,并且有N-1个表(或分区)的大小总和小于hive.auto.convert.join.noconditionaltask.size参数指定的值,那么会直接将连接转为Map join。 -
hive.auto.convert.join.noconditionaltask.size
默认值:10000000
如果hive.auto.convert.join.noconditionaltask是关闭的,则本参数不起作用。否则,如果参与连接的N个表(或分区)中的N-1个 的总大小小于这个参数的值,则直接将连接转为Map join。默认值为10MB。 -
hive.optimize.skewjoin
默认值:false
是否开启数据倾斜的join优化 -
hive.skewjoin.key
默认值:100000
判断数据倾斜的阈值,如果在join中发现同样的key超过该值则认为是该key是倾斜的join key -
hive.skewjoin.mapjoin.map.tasks
默认值:10000
在数据倾斜join时map join的map数控制 -
hive.skewjoin.mapjoin.min.split
默认值:33554432
数据倾斜join时map join的map任务的最小split大小,默认是33554432,该参数要结合上面的参数共同使用来进行细粒度的控制;
8.2 了解
-
hive.ppd.recognizetransivity
默认值:true
等值join条件下是否传递重复的谓词过滤器 -
hive.join.emit.interval
默认值:1000
在发出join结果之前对join最右操作缓存多少行 -
hive.join.cache.size
默认值:25000
在做表join时缓存在内存中的行数 -
hive.mapjoin.bucket.cache.size
默认值:100
mapjoin时内存cache的每个key要存储多少个value -
hive.mapjoin.followby.map.aggr.hash.percentmemory
默认值:0.3
map端聚合时hash表的内存占比,该设置约束group by在map join后进行,否则使用hive.map.aggr.hash.percentmemory来确认内存占比 -
hive.mapjoin.localtask.max.memory.usage
默认值:0.90
mapjoin本地任务执行时hash表容纳key/value的最大量,超过这个值的话本地任务会自动退出 -
hive.mapjoin.followby.gby.localtask.max.memory.usage
默认值:0.55
类似上面,只不过是如果mapjoin后有一个group by的话,该配置控制类似这样的query的本地内存容量上限 -
hive.mapjoin.check.memory.rows
默认值:100000
在运算了多少行后执行内存使用量检查 -
hive.ignore.mapjoin.hint
默认值:true
是否忽略mapjoin标记 -
hive.smbjoin.cache.rows
默认值: 10000
每个sort-merge-bucket join表应该在内存中缓存多少个具有相同键值的行。 -
hive.mapjoin.optimized.hashtable
默认值: true
在 MapJoin的时候是否使用内存优化的hash table。只有在 tez 和 spark 引擎下起作用。因为内存优化的hash table不能被序列化 -
hive.mapjoin.optimized.hashtable.wbsize
默认值: 10485760 (10 * 1024 * 1024)
优化后的hashtable使用一连串缓存来存储数据,这是一个缓存的大小。 -
hive.hashtable.initialCapacity
默认值: 100000
如果没有统计数据,mapjoin hashtable的初始容量 -
hive.hashtable.loadfactor
默认值: 0.75
mapjoin过程中,使用hashtable保存key/value。这个参数是内存中 hashtable 的 load factor。
9. 压缩相关参数
9.1 须知道 (测试,OK)
-
hive.exec.compress.output
默认值:false
控制hive的查询结果输出是否进行压缩,压缩方式在hadoop的mapred.output.compress中配置 -
hive.exec.compress.intermediate
默认值:false
控制hive的查询中间结果是否进行压缩,默认不压缩false -
io.compression.codecs
设置了哪些压缩算法
org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.DeflateCodec,org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.Lz4Codec,com.hadoop.compression.lzo.LzopCodec -
mapreduce.output.fileoutputformat.compress
默认值:false
mapreduce最终输出数据是否压缩 -
mapreduce.output.fileoutputformat.compress.codec
默认值:org.apache.hadoop.io.compress.DefaultCodec
mapreduce最终输出数据使用的压缩算法 -
mapreduce.output.fileoutputformat.compress.type
默认值:RECORD
mapreduce最终数据输出压缩方式。可选项 RECORD(对每一条数据进行压缩),BLOCK(对一组数据进行压缩),NONE -
mapreduce.map.output.compress
默认值:true
map输出是否压缩 -
mapreduce.map.output.compress.codec
默认值:org.apache.hadoop.io.compress.SnappyCodec
Map输出阶段压缩算法
10. 其他参数
10.1 动态分区相关(OK)
-
hive.exec.dynamic.partition
默认值:false
是否允许动态分区 -
hive.exec.dynamic.partition.mode
默认值:strict
在strict模式下,动态分区的使用必须在一个静态分区确认的情况下,其他分区可以是动态。nonstrict模式下所有分区都可以是动态的 -
hive.exec.max.dynamic.partitions
默认值:1000
动态分区的上限 -
hive.exec.max.dynamic.partitions.pernode
默认值:100
每个mapper/reducer节点可以创建的最大动态分区数 -
hive.exec.max.created.files
默认值:100000
一个mapreduce作业能创建的HDFS文件最大数
10.1 须知道
-
hive.enforce.sorting
默认值:hive2.x之前全为false,hive2.x移除这个参数,强制为true
开启强制排序时,插数据到表中会进行强制排序 -
hive.enforce.bucketing
默认值:hive2.x之前全为false,hive2.x移除这个参数,强制为true
数据分桶是否被强制执行,默认false,如果开启,则写入table数据时会启动分桶 -
hive.exec.parallel
默认值:false
hive的执行job是否并行执行 -
hive.exec.parallel.thread.number
默认值:8
最多有多少个作业可以并行执行。 -
hive.mapred.mode
默认值:hive 2.0 之前是 nonstrict,2.0之后为strict
如果是strict模式,很多有风险的查询会被禁止运行,比如全表扫描、笛卡尔积等等 -
hive.debug.localtask
默认值:false
是否调试本地任务 -
hive.optimize.ppd
默认值:true
是否启用谓词下推 -
hive.optimize.ppd.storage
默认值:true
是否将为此下推推送到存储处理中。如果hive.optimize.ppd置为false,这个参数忽略 -
hive.execution.engine
默认 mr,可选项 mr、tez、spark。
设置为 mr 的时候,每执行一个sql都会单独开一个application,执行完就释放资源。
设置为 spark 的时候,从开始第一个sql开始,只要没有退出hive客户端就不会另外开启一个 application,所有任务都只用一个application,申请资源后重复利用。 -
hive.mapred.reduce.tasks.speculative.execution
默认值:true
reduce任务推测执行是否开启 -
hive.limit.row.max.size
默认值:100000
在使用limit做数据的子集查询时保证的最小行数据量 -
hive.limit.optimize.limit.file
默认值:10
使用简单limit查询数据子集时,可抽样的最大文件数 -
hive.limit.optimize.enable
默认值:false
使用简单limit抽样数据时是否开启优化选项 -
hive.limit.optimize.fetch.max
默认值:50000
使用简单limit抽样数据允许的最大行数 -
hive.exec.mode.local.auto
默认值:false
是否由hive决定自动在local模式下运行 -
hive.exec.mode.local.auto.inputbytes.max
默认值:134217728
如果 hive.exec.mode.local.auto 为 true,当输入文件大小小于此阈值时可以自动在本地模式运行 -
hive.exec.mode.local.auto.input.files.max
默认值:4
map 任务数不超过这个数才能启动本地模式 -
hive.optimize.bucketingsorting
默认值:true -
hive.optimize.reducededuplication.min.reducer
默认值: 4 -
hive.optimize.correlation
默认值:false -
hive.optimize.sort.dynamic.partition
默认值:Hive 0.14.0 之后都置为false -
hive.cbo.enable
默认值:Hive 1.1.0 之后都置为true -
hive.cbo.returnpath.hiveop
默认值:false -
hive.optimize.null.scan
默认值:true
10.2 了解
-
hive.exec.scratchdir
Hive 0.14.0 之后默认值为 /tmp/hive。
这个目录用来存储不同 map/reduce 阶段的plans 和这些阶段的中间输出。 -
hive.scratch.dir.permission
默认值:700
在scratch根目录下开辟的特定用户目录的权限。 -
hive.ppd.remove.duplicatefilters
默认值:true
查询优化时,filters会被往下推。如果这个参数置为true,则下推的filters会被保留在operator tree中,原始filter被删除。如果false,则原始filter会被保留在operator tree的原始位置 -
hive.sample.seednumber
默认值:0
用来区分抽样的数字 -
hive.autogen.columnalias.prefix.label
默认值:_c
当在执行中自动产生列别名的前缀,当类似count这样的聚合函数起作用时,如果不明确指出count(a) as xxx的话,那么默认会从列的位置的数字开始算起添加,比如第一个count的结果会冠以列名_c0,接下来依次类推 -
hive.autogen.columnalias.prefix.includefuncname
默认值:false
在自动生成列别名时是否带函数的名字 -
hive.start.cleanup.scratchdir
默认值:false
当启动hive服务时是否清空hive的scratch目录 -
hive.output.file.extension
默认值:(empty)
输出文件扩展名 -
hive.insert.into.multilevel.dirs
默认值:false
是否插入到多级目录 -
hive.exec.script.maxerrsize
默认值:100000
一个map/reduce任务允许打印到标准错误里的最大字节数,为了防止脚本把分区日志填满 -
hive.exec.rowoffset
默认值:false
是否提供 row offset 虚拟列 -
hive.exec.pre.hooks
默认值:空
执行前置条件,一个用逗号分隔开的实现了org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext接口的java class列表,配置了该配置后,每个hive任务执行前都要执行这个执行前钩子 -
hive.exec.post.hooks
默认值:空
同上,执行后钩子 -
hive.exec.failure.hooks
默认值:空
同上,异常时钩子,在程序发生异常时执行 -
hive.heartbeat.interval
默认值:1000
发送心跳的时间间隔,在mapjoin和filter操作中使用 -
hive.udtf.auto.progress
默认值: false
UDTF执行时hive是否发送进度信息到TaskTracker -
hive.exec.counters.pull.interval
默认值:1000
运行中job轮询JobTracker的时间间隔,设置小会影响JobTracker的load,设置大可能看不出运行任务的信息,要去平衡 -
hive.exec.drop.ignorenonexistent
默认值:true
这个参数设置为true的情况下,如果表xxx不存在,drop table xxx会报错 -
hive.exec.show.job.failure.debug.info
默认值:true
在作业失败时是否提供一个任务debug信息 -
hive.auto.progress.timeout
默认值:0
运行自动progressor的时间间隔,设置为0等同于forever -
hive.table.parameters.default
默认值:empty
新建表的属性字段默认值 -
hive.variable.substitute
默认值:true
是否支持变量替换,如果开启的话,支持语法如{system:var}和${env.var} -
hive.error.on.empty.partition
默认值:false
在遇到结果为空的动态分区时是否报错 -
hive.exec.default.partition.name
默认值:HIVE_DEFAULT_PARTITION
当动态分区启用时,如果数据列里包含null或者空字符串的话,数据会被插入到这个分区 -
hive.fetch.output.serde
默认值:org.apache.hadoop.hive.serde2.DelimitedJSONSerDe
FetchTask序列化fetch输出时需要的SerDe -
hive.optimize.reducededuplication
默认值:true
如果数据已经根据相同的key做好聚合,那么去除掉多余的map/reduce作业 -
hive.new.job.grouping.set.cardinality
默认值 30,多维统计的时候所用到的参数 --- 了解一下 -
hive.optimize.skewjoin.compiletime
默认值: false -
hive.optimize.union.remove
默认值: false -
hive.mapred.supports.subdirectories
默认值: false -
hive.auto.convert.join.use.nonstaged
默认值: false -
hive.rework.mapredwork
默认值:false -
hive.scratchdir.lock
默认值:false -
hive.conf.validation
默认值:true -
hive.fetch.task.conversion
默认值:Hive 0.14.0之后置为 more -
hive.map.groupby.sorted
默认值:hive2.0 之前false,hive2.0开始true -
hive.fetch.task.aggr
默认值:false -
hive.execution.mode
默认 container,可选项 container,llap。
hive 2.0 以上版本出现 -
hive.mapred.local.mem
默认值 0,Hive 2.0 版本开始出现
local模式下,mapper和reducer的内存 -
hive.optimize.countdistinct
默认值:true,Hive 3.0 版本出现
是否将count distinct 分为2个阶段执行,第一阶段根据distinct key使用多个reducer,第二阶段使用一个reducer -
hive.optimize.remove.sq_count_check
默认值:false,Hive 3.0 版本出现 -
hive.merge.nway.joins
默认值: true,hive2.2.0版本出现
多join并且join条件相同,把join合并为一个join operator -
hive.optimize.limittranspose
默认值:false,hive2.0.0版本出现 -
hive.optimize.limittranspose.reductionpercentage
默认值:1.0,hive2.0.0版本出现 -
hive.optimize.limittranspose.reductiontuples
默认值:0,hive2.0.0版本出现 -
hive.optimize.filter.stats.reduction
默认值:false,hive2.1.0版本出现 -
hive.cbo.cnf.maxnodes
默认值:-1, hive2.1.1之后出现 -
hive.groupby.position.alias
默认值:false, hive2.2.0之后出现 -
hive.orderby.position.alias
默认值:true, hive2.2.0之后出现 -
hive.io.sarg.cache.max.weight.mb
默认值:10, Hive 2.2.1 出现