HIVE常用优化经验总结

本文总结了HIVE的调优经验,包括开启本地模式以优化执行效率,使用MAPJOIN减少Stage层数,启用PARALLEL特性提高资源利用率,选择合适的内部表存储格式如ORC和PARQUET,以及合理使用SNAPPY压缩以平衡速度和空间。此外,还探讨了小文件合并策略,以解决过多小文件带来的性能问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HIVE常用的调优经验

1、开启本地模式
set hive.exec.mode.local.auto=true;
2、使用MAPJION
set hive.auto.convert.join=false;
使用MAPJION的主要作用是有效的减少一个SQL任务中的Stage层数。同一个SQL任务下,越少的Stage层代表越快的效率。
3、PARALLEL特性
set hive.exec.parallel=true;
hive.exec.parallel.thread.number
Default Value: 8
PARALLEL特性可以是的某些任务中的stage子任务可以一并行执行模式同时执行,相对于一直串行执行stage任务来说有效的提升资源利用率。
PARALLEL特性主要针对如下几种情况:
多个数据源表关联
插入多个目标表
UNION ALL
4、内部表
经验总结如下(不同数据文件有一定误差):
ORC比PARQUET的压缩率高大约10~20%。
(TEXT:10G -> ORC:2~3G or PARQUET:3~4G)
PARQUET比ORC的执行效率高大约10~20%。
Hive中内部表推荐使用存储格式 ORC->PARQUET->RCFILE-> TEXTFILE
如果使用Spark引擎使用较多,内部表定义推荐使用存储格式 PARQUET –> ORC ->RCFILE-> TEXTFILE
建表语句:PARTITIONED BY (MONTH_PART STRING comment ‘月份分区’)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\001’
NULL DEFINED AS ‘’
STORED AS ORC stored as orc tblproperties (“orc.compress”=“SNAPPY”); --------ORC
STORED AS PARQUET; ---------PARQUET
5、外部表
因为Hive采取的是读时校验,所以建立外部表是指定的存储格式需要和入库文件保持一致。一般默认为TEXTFILE.
create external table Addresses(。。。。)
6、压缩格式
常用压缩格式为SNAPPY,GZIP,BZIP2,但是对于使用场景来说非常严格,切勿乱使用。

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.SnappyCodec

6.1、为什么选择SNAPPY?
1、SNAPPY的压缩和解压缩效率基本所有场景下都是最高的,不会过多的占用有限的CPU资源。
2、SNAPPY不会影响Map的分片和Reduce合并,能够有效的避免资源利用不足和过多小文件。
3、SNAPPY的压缩比,虽然比其他压缩格式来说确实较小。但是压缩起到重要作用的地方是MapReduce中间各Stage层的磁盘读写。文件系统上长期存储的文件,可以通过设置文件格式为ORC或者PARQUET达到很好的空间利用率。
Map阶段
现在默认使用SNAPPY.

mapreduce.map.output.compress
true

mapreduce.map.output.compress.codec org.apache.hadoop.io.compress.SnappyCodec Reduce阶段 备用参数 set hive.exec.compress.output=true; --控制hive最终生成结果为压缩。 set hive.exec.compress.intermediate=true; --控制hive中间中间各Stage层结果是否为压缩。

6.2、出库:
使用hadoop fs -get方式来将HDFS文件拖拽到本地时,由于命令只是单纯的拷贝,所以来源表中的存储格式和压缩格式不会改变。如果你需要get出来的文件是TEXTFILE文件那么需要在来源表创建定义时进行设置。如果你需要get出来的文件是GZIP压缩,那么需要指定Hive输出为压缩且设置压缩编码为GZIP。

7、小文件合并
当大量小文件,文件数目非常多的时候,容易使得HDFS上块数目相对过多,给 Namenode带来压力,影响HDFS文件读写性能,而且导致MapReduce任务执行效率降低。因此,在MapReduce任务的Map阶段和Reduce阶段都要进行文件合并,一方面可以更加合理的利用集群资源,另一方面提高任务的执行效率。

7.1、入库合并
比如这里总共500G的GZIP文件需要入库。下面几种方式来处理:

单个文件大小 文件个数 Map个数 执行时间 问题及说明
50G 10 10 20X 启动Map太少,单个Map执行时间异常长,整体资源利用很低,任务执行时间异常长。
5G 100 100 3X 启动Map较少,单个Map执行时间较长,整体资源利用率低,任务执行时间很长。
1G 500 500 X 启动Map合适,单个Map在4G内存的Map下执行合适,整体资源利用率较好,任务执行时间可接受。
250M 2000 2000 X 启动Map较多,单个Map在1~2G内存的Map下执行时间合适,整体资源利用率高,任务执行时间可接受。
20M 25000 25000 20X 启动Map太多,单个Map执行时间段,启动过多Map导致时间都浪费在Container申请和Map任务启动上。资源利用率异常高,导致其他任务无法获取container,任务执行时间异常长。
7.2 MAP合并
Map阶段如果使用合适文件格式和压缩方式,比如input读取的都是小文件,Map会自动进行合并,一般会合并至接近块大小。
hive.merge.mapfiles
Default Value: true
Added In: Hive 0.4.0
Merge small files at the end of a map-only job.

hive.mergejob.maponly
Default Value: true
Added In: Hive 0.6.0
Removed In: Hive 0.11.0
Try to generate a map-only job for merging files if CombineHiveInputFormat is supported. (This configuration property was removed in release 0.11.0.)

hive.merge.size.per.task
Default Value: 256000000
Added In: Hive 0.4.0
Size of merged files at the end of the job.

hive.merge.smallfiles.avgsize
Default Value: 16000000
默认值略小,可以考虑增加到100000000
Added In: Hive 0.5.0
When the average output file size of a job is less than this number, Hive will start an additional map-reduce job to merge the output files into bigger files. This is only done for map-only jobs if hive.merge.mapfiles is true, and for map-reduce jobs if hive.merge.mapredfiles is true.

备用参数
set mapred.max.split.size=256000000;
set mapred.min.split.size.per.node=100000000;
set mapred.min.split.size.per.rack=100000000;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

REDUCE合并
Reduce阶段如果不控制合并小文件,有如下影响:
大量小文件对于NameNode造成压力
Reduce任务多造成集群资源浪费
文件作为来源表继续上层加工时可能出现过多Map,造成集群资源浪费
hive.merge.mapredfiles
Default Value: false
Added In: Hive 0.4.0
Merge small files at the end of a map-reduce job.

hive.merge.size.per.task
Default Value: 256000000
Added In: Hive 0.4.0
Size of merged files at the end of the job.

hive.merge.smallfiles.avgsize
Default Value: 16000000
默认值略小,可以考虑增加到100000000
Added In: Hive 0.5.0
When the average output file size of a job is less than this number, Hive will start an additional map-reduce job to merge the output files into bigger files. This is only done for map-only jobs if hive.merge.mapfiles is true, and for map-reduce jobs if hive.merge.mapredfiles is true.

备用参数
set mapred.reduce.tasks=n; (n为整数)
可以通过控制Reduce数目来达到合并小文件的作用,如果生成了100个几M的文件,可以将reduce数目设置为1,这样最后会生成一个几百M的文件,对于整体流程来说有极大的优化作用。

以上就是为大家介绍的这一板块的主要内容,都是自己的学习过程,希望能给大家带来一定的指导作用,有用的还望大家点个支持,有错误烦请指出,我们一起讨论进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值