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进行处理。