优点
在Hadoop集群中,有大量的数据复制和移动操作,压缩过后可以减少文件的大小,从而可以减少磁盘和网络的I/O。
压缩格式
常见的有gzip、bzip2、lzo、snappy、lz4等压缩算法。一般来说,好的压缩算法都是在解压缩的时间和压缩率上有不同的权衡。比如说:snappy压缩算法虽然压缩率不高,但是解压缩的时间相对于前两个更短。在hadoop中的压缩格式需要支持分割(一个文件可以被压缩成几个文件,并且每个压缩文件可以单独解压),这样可以交给多个map任务处理。
Hive的压缩配置
**以配置snappy为例 **
- 因为Hive是以Hadoop框架为基础的,所以先要查看hadoop是否支持snappy压缩。
使用下面的命令查看hadoop当前支持的压缩。可以发现默认情况下不支持snappy。
[wulei@bigdata-00 hadoop-2.5.0]$ bin/hadoop checknative
- 编译Snappy
具体编译流程见:http://www.micmiu.com/bigdata/hadoop/hadoop-snappy-install-config/ -
检查是否编译成功
-
在mapreduce中配置压缩
首先说明mapreduce哪些过程可以设置压缩:需要分析处理的数据在进入map前可以压缩,然后解压处理,map处理完成后的输出可以压缩,这样可以减少网络I/O(reduce通常和map不在同一节点上),reduce拷贝压缩的数据后进行解压,处理完成后可以压缩存储在hdfs上,以减少磁盘占用量。
- 在Hive中设置压缩
因为有的hive语句是嵌套的,可以对hive的中间结果集也设置压缩
hive.exec.compress.intermediate=true
开启压缩
mapreduce.map.output.compress=true
配置压缩格式
mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec
- 因为Hive底层用的mapreduce,也可以直接在hadoop中对mapred-site.xml进行配置
<!-- map输出压缩 -->
<property>
<name>mapreduce.map.output.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.map.output.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
<!-- reduce输出压缩 -->
<property>
<name>mapreduce.output.fileoutputformat.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.output.fileoutputformat.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>