hive优化记录----合并小文件压缩输出

Hive简要介绍

Hive是基于Hadoop的数据仓库平台,由Facebook贡献,其支持类似SQL的结构化查询功能。

Hive的组件总体上可以分为以下几个部分:用户接口(UI)、驱动、编译器、元数据(Hive系统参数数据)和执行引擎。

1) 对外的接口UI包括以下几种:命令行CLI,Web界面、JDBC/ODBC接口;

2) 驱动:接收用户提交的查询HQL;

3) 编译器:解析查询语句,执行语法分析,生成执行计划;

4) 元数据Metadata:存放系统的表、分区、列、列类型等所有信息,以及对应的HDFS文件信息等;

5) 执行引擎:执行执行计划,执行计划是一个有向无环图,执行引擎按照各个任务的依赖关系选择执行任务(Job)。

Hive编译器将HQL代码转换成一组操作符(operator),操作符是Hive的最小操作单元,每个操作符代表了一种HDFS操作或者MapReduce作业。


Hive优化记录

HDFS非常容易存储大数据文件,如果Hive中存在过多的小文件会给namecode带来巨大的性能压力。同时小文件过多会影响JOB的执行,hadoop会将一个job转换成多个task,即使对于每个小文件也需要一个task去单独处理,task作为一个独立的jvm实例,其开启和停止的开销可能会大大超过实际的任务处理时间。

同时我们知道hive输出最终是mr的输出,即reducer(或mapper)的输出,有多少个reducer(mapper)输出就会生成多少个输出文件,根据shuffle/sort的原理,每个文件按照某个值进行shuffle后的结果。

为了防止生成过多小文件,hive可以通过配置参数在mr过程中合并小文件。而且在执行sql之前将小文件都进行Merge,也会提高程序的性能。我们可以从两个方面进行优化,其一是map执行之前将小文件进行合并会提高性能,其二是输出的时候进行合并压缩,减少IO压力。


Map操作之前合并小文件:

setmapred.max.split.size=2048000000

#每个Map最大输入大小设置为2GB(单位:字节)

sethive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat

#执行Map前进行小文件合并


输出时进行合并:

sethive.merge.mapfiles = true

#在Map-only的任务结束时合并小文件

sethive.merge.mapredfiles= true

#在Map-Reduce的任务结束时合并小文件

sethive.merge.size.per.task = 1024000000

#合并后文件的大小为1GB左右

sethive.merge.smallfiles.avgsize=1024000000

#当输出文件的平均大小小于1GB时,启动一个独立的map-reduce任务进行文件merge


如果需要压缩输出文件,就需要增加一个压缩编解码器,同时还有两个压缩方式和多种压缩编码器,压缩方式一个是压缩输出结果,一个是压缩中间结果,按照自己的需求选择,我需要的是gzip就选择的GzipCodec,同时也可以选择使用BZip2Codec、SnappyCodec、LzopCodec进行压缩。


压缩文件:

sethive.exec.compress.output=true;

#默认false,是否对输出结果压缩

setmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;

#压缩格式设置

setmapred.output.compression.type=BLOCK;

#一共三种压缩方式(NONE, RECORD,BLOCK),BLOCK压缩率最高,一般用BLOCK。


我们可设置的属性还有很多,可以在hive的命令行中输入set;就会出现所有的属性,同时如果需要更细化的处理操作可以结合python编写UDF进行处理。


你可能感兴趣的:(hive学习)