Hive之配置使用snappy压缩

时间:2024-03-23 17:54:58

https://zhuanlan.zhihu.com/p/103740807

https://blog.csdn.net/xsdxs/article/details/53152599

 

 

为什么要压缩
  在Hive中对中间数据或最终数据做压缩,是提高数据吞吐量和性能的一种手段。对数据做压缩,可以大量减少磁盘的存储空间,比如基于文本的数据文件,可以将文件压缩40%或更多。同时压缩后的文件在磁盘间传输和I/O也会大大减少;当然压缩和解压缩也会带来额外的CPU开销,但是却可以节省更多的I/O和使用更少的内存开销。

压缩模式说明
1. 压缩模式评价
可使用以下三种标准对压缩方式进行评价:

压缩比:压缩比越高,压缩后文件越小,所以压缩比越高越好。
压缩时间:越快越好。
已经压缩的格式文件是否可以再分割:可以分割的格式允许单一文件由多个Mapper程序处理,可以更好的并行化。
2. 压缩模式对比
BZip2有最高的压缩比但也会带来更高的CPU开销,Gzip较BZip2次之。如果基于磁盘利用率和I/O考虑,这两个压缩算法都是比较有吸引力的算法。
LZO和Snappy算法有更快的解压缩速度,如果更关注压缩、解压速度,它们都是不错的选择。 LZO和Snappy在压缩数据上的速度大致相当,但Snappy算法在解压速度上要较LZO更快。
Hadoop的会将大文件分割成HDFS block(默认64MB)大小的splits分片,每个分片对应一个Mapper程序。在这几个压缩算法中 BZip2、LZO、Snappy压缩是可分割的,Gzip则不支持分割。
3. 常见压缩格式
Hive之配置使用snappy压缩

Hadoop编码/解码器方式,如下表所示

Hive之配置使用snappy压缩

4. 什么是可分割
  在考虑如何压缩那些将由MapReduce处理的数据时,考虑压缩格式是否支持分割是很重要的。考虑存储在HDFS中的未压缩的文件,其大小为1GB,HDFS的块大小为64MB,所以该文件将被存储为16块,将此文件用作输入的MapReduce作业会创建1个输人分片(split,也称为“分块”。对于block,我们统一称为“块”。)每个分片都被作为一个独立map任务的输入单独进行处理。
  现在假设,该文件是一个gzip格式的压缩文件,压缩后的大小为1GB。和前面一样,HDFS将此文件存储为16块。然而,针对每一块创建一个分块是没有用的,因为不可能从gzip数据流中的任意点开始读取,map任务也不可能独立于其他分块只读取一个分块中的数据。gzip格式使用DEFLATE来存储压缩过的数据,DEFLATE将数据作为一系列压缩过的块进行存储。问题是,每块的开始没有指定用户在数据流中任意点定位到下一个块的起始位置,而是其自身与数据流同步。因此,gzip不支持分割(块)机制。
  在这种情况下,MapReduce不分割gzip格式的文件,因为它知道输入是gzip压缩格式的(通过文件扩展名得知),而gzip压缩机制不支持分割机制。因此一个map任务将处理16个HDFS块,且大都不是map的本地数据。与此同时,因为map任务少,所以作业分割的粒度不够细,从而导致运行时间变长。
 

前言
OS:CentOS 7

hadoop:2.7.7

hive:2.3.0

Hive中配置snappy压缩,可以分别在Mapper输出阶段和Reducer输出阶段使用压缩算法。也可以将压缩后数据文件加载到表中用于查询,Hive会通过后缀名自动识别对应的压缩格式,并在查询时进行解压,但需要保持数据文件和表格式相同,否则只会显示结果全为NULL

查看本机目前可供Hadoop使用的压缩算法
使用以下命令,可以查看是否有相应压缩算法的库,如果显示为false,则需要额外安装

hadoop checknative -a
1
PS: Hadoop 2.X版本已经集成了snappy、lz4、bzip2等压缩算法的编/解码器,会自动调用对应的本地库,而CentOS 7中自带snappy依赖库,故无需安装安装snappy依赖)

开启Map阶段输出压缩
Hive中开启Map阶段输出压缩,可以减少在Hive中MR Job的Mapper和Reducer之间的网络I/O。开启此功能需要同时配置Hive和Hadoop相关参数,可以在Hive中配置,保证仅在当前会话生效,也可以直接在Hive和Hadoop的对应配置文件中修改默认参数持续生效。配置过程如下:

1)开启Hive中MR中间文件压缩:
hive> set hive.exec.compress.intermediate=true;


2)开启Hadoop的MapReduce任务中Map输出压缩功能:
hive> set mapreduce.map.output.compress=true;


3)设置Hadoop的MapReduce任务中Map阶段压缩算法(对应的编/解码器):
hive> set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;


4)至此就完成了Map阶段的压缩配置
开启Reduce阶段输出压缩
当Hive将查询内容写入到表中(local/hdfs)时,输出内容同样可以进行压缩。同样需要同时配置Hive和Hadoop参数。既可以在Hive中配置,保证仅在当前会话生效,也可以直接在Hive和Hadoop的对应配置文件中修改默认参数持续生效。配置过程如下:

1)开启Hive最终查询结果输出文件压缩功能:
hive> set hive.exec.compress.output=true;

2)开启Hadoop中的MR任务的最终输出文件压缩:
hive> set mapreduce.output.fileoutputformat.compress=true;

3)设置Hadoop中MR任务的最终输出文件压缩算法(对应的编/解码器):
hive> set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

4)设置Hadoop中MR任务序列化文件的压缩类型,默认为RECORD即按照记录RECORD级别压缩(建议设置成BLOCK):
hive> set mapreduce.output.fileoutputformat.compress.type=BLOCK;

5)执行查询语句,观察执行结果文件(后缀名为.snappy):
hive> insert overwrite local directory '/tmp/hive/data/export/' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' select * from emp;

6)加载本地的缩数据文件到临时表中:
hive> create table tmp like emp;
hive> load data local inpath '/tmp/hive/data/export/000000_0.snappy' overwrite into table tmp;

7)查询临时表结果
hive> select * from tmp;
8)至此就完成了Reduce阶段的压缩配置
 

end ~