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
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的文件,对于整体流程来说有极大的优化作用。
以上就是为大家介绍的这一板块的主要内容,都是自己的学习过程,希望能给大家带来一定的指导作用,有用的还望大家点个支持,有错误烦请指出,我们一起讨论进步!