hive优化3-map\reduce\shuffle\output等多阶段参数调优
map阶段
1.hive.vectorized.execution.enabled
默认false. map方法逐行处理数据,开启之后hive构造一个批量输入的数组,一次处理1万条数据。(数据量不大,或计算不复杂是不是没必要开启?
MapReduce只支持map端向量化执行,TEZ和SPARK支持map和reduce端向量化执行。
2.hive.ignore.mapjoin.Hint
默认true. 开启忽略Hint关键字,若要使用关键字,需关闭
3.hive.auto.convert.join
默认true. 开启mapjoin自动优化
4.hive.smalltable.filesize/hive.mapjoin.smalltable.filesize
默认2500000(25M),join时小表数据量小于该值自动开启mapjoin优化
hive.auto.convert.join.use.nonstaged
默认false. 是否省略小表加载作业。一些mapjoin,如果小表没有必要做数据过滤或者列投影,则直接省略小表加载时额外的MapReduce作业
5.hive.map.aggr
默认true. 是否开启map任务聚合
6.hive.map.aggr.hash.percentmemory
默认0.5,表示开启map任务聚合,聚合所用hash表最多占整个map内存50%
7.hive.mapjoin.optimized.hashtable
默认true. 用内存优化的hash表做mapjoin. 由于该类型hash表无法序列化到磁盘,只适用于TEZ和spark
8.hive.mapjoin.optimized.hashtable.wbsize
默认10485760(10M). 优化hash表使用链块内存缓存,可以优化数据较大的表加载,小表不适用,会浪费内存
9.hive.map.groupby.sorted
hive2.0之后默认true. 分桶表和排序表,若分组聚合的key值与分桶或排序的列一致,优化使用BucketizedHiveInputFormat
10.hive.vectorized.execution.mapjoin.native.enabled
默认false. 是否使用原生向量化执行模式执行mapjoin。比普通mapjoin快
11.hive.vectorized.execution.mapjoin.minmax.enabled
默认false. 是否使用vector mapjoin hash表,用于整型连接的最大值和最小值过滤
reduce阶段
与mapper读取本地文件不同,reducer会去拉取远程map节点产生的数据,这里会涉及网络IO和磁盘IO。
如非必须对数据全局处理如全局排序,关掉reduce阶段的操作就可以提升程序性能。
1.mapred.reduce.tasks
默认-1. 设置reducer的数量,-1代表系统根据需要自行决定reducer数量
2.hive.exec.reducers.bytes.per.reducer
hive0.14版本后默认256M. 设置每个reducer处理的数据量,若输入reduce数据量1G,那么会拆分为4个reducer任务(这应该是在map端无小文件的情况下吧
3.hive.exec.reducers.max
设置一个作业运行的最大reduce个数,默认值999
4.hive.multigroupby.singlereducer
如果一个SQL有多分组聚合操作,且分组使用相同的字段,那么这些分组聚合可以用一个作业的reduce完成,而不是分解成多个作业、多个reduce。可以减少作业重复读取和shuffle的操作
5.hive.mapred.reduce.tasks.speculative.execution
表示是否开启reduce任务推测执行。即系统在一个reduce任务中执行进度远低于其他任务的执行进度,会尝试在另外的机器上启动一个相同的reduce任务
6.hive.optimize.reducededuplication
当数据需要按相同的键再次聚合时,开启这个配置可以减少重复的聚合操作
7.hive.vectorized.execution.reduce.enabled
是否启用reduce任务的向量化执行,默认true。mapreduce计算引擎不支持reduce阶段向量化处理
8.hive.vectorized.execution.reduce.groupby.enabled
reduce任务分组聚合查询的向量化执行,默认true。mapreduce计算引擎不支持reduce阶段向量化处理
shuffle阶段
从mapper的map方法输出到reducer的reduce方法输入的整个过程
mapreduce的map端聚合-combiner类
combiner的逻辑可以直接使用reducer的逻辑,对本地的mapper任务做reducer程序逻辑,一般称为map端的reduce任务。可以减少shuffle过程的数据量,减轻系统的磁盘IO与网络IO
1.hive.map.aggr
默认true. 表示开启map端聚合。启用之后,会在map端多一个reduce操作,这是为了减少map任务的输出,减少传输到下游任务的shuffle数据量。但若数据经聚合后不能明显减少,那就会浪费机器的IO资源。所以这时引入两个参数hive.map.aggr.hash.min.reduction和hive.groupby.map.aggr.checkinterval用于控制何时开启聚合
2.hive.map.aggr.hash.min.reduction
是一个阈值,默认0.5
3.hive.groupby.mapaggr.checkinterval
默认100000. hive启用combiner会尝试取这个配置对应的数据量进行聚合,聚合后数据除以聚合前数据,若小于hive.mapaggr.hash.min.reduction会自动关闭(这里应该是大于??)
4.hive.map.aggr.hash.min.percentmemory
默认0.5. mapper端聚合占用的最大内存。若分配给该节点的最大堆为1024MB,那么聚合能使用hash表最大内存512MB
5.hive.map.aggr.hash.force.flush.memory.threshold
默认0.9. 该值表示当聚合占用hash表内存超0.9触发落磁盘,如hash表内存512MB,当hash表数据内存超461MB时触发hash表写入磁盘
mapreduce作业输出
1.开启中间作业文件压缩:
hive.exec.compress.intermediate=true
2.开启写入hive或hdfs文件压缩:
hive.exec.compress.output=true
要在mapreduce中起作用的前提是,还要设置:
mapred.output.compression.codec; mapred.output.compression两个属性
参考:
set hive.exec.compress.intermediate=true;
set mapreduce.map.output.compress=true;
set hive.intermadiate.compression.code=org.apache.hadoop.io.compress.SnappyCodec;
set hive.intermediate.compression.type=BLOCK;
小文件压缩可以看:hive优化2-hive的Input阶段:inputsplit与map数量、小文件
mapreduce作业与hive配置
1.hive.optimize.countdistinct
默认true. 3.0新增配置项,优化去重计数作业,分成两个作业来处理,以达到减缓SQL数据倾斜作用
2.并行:hive.exec.parallel=true;hive.exec.parallel.thread.num=8
默认为False;8. 第一个参数是开启作业并行。如果一个SQL有两个阶段stage1、stage2, 没有直接以来的关系,开启该参数会以并行方式执行这两个阶段;第二个参数指一个作业最多允许8个作业同时执行
3.hive.exec.mode.local.auto
默认false, 是否开启本地执行模式,数据量较小的作业可以在单台机器上处理完所有任务,能有效节省时间。还需几个参数:hive.exec.mode.local.auto.inputbytes.max默认值134217728(128M),表示作业处理数据量小于该值,开启本地模式;hive.exec.mode.local.auto.tasks.max默认值为4,作业启动数目不大于该值,本地模式才生效,0.9版本之后该参数为:hive.exec.mode.local.auto.input.files.max
4.hive.optimize.correlation
默认false,相关性优化,配置可以减少重复的shuffle操作(在join和groupby的key值一样的情况下可以优化)