Hadoop数据压缩
概述
- 压缩技术能有效减少HDFS读写字节数。
- 在MR运行时,IO操作,网络数据传输,Shuffle,Merge要花大量的时间,尤其是数据规模很大和工作负载密集的情况下。
- 数据压缩对于节省资源,最小化磁盘IO和网络传输非常有帮助。可以在任意MR阶段启用压缩。
- 尽管压缩与解压缩的CPU开销不高,但是也有代价。
压缩策略和原则
- 压缩是提高Hadoop运行效率的一种优化策略
- 通过对Mapper、Reducer运行过程中的数据进行压缩,以减少磁盘IO,提高MR程序的运行速度
- 采用压缩技术减少了磁盘IO,但同时也增加了CPU运算负担。所以,压缩特性运用得到能提高效率,运用不当也可能降低效率
- 压缩基本原则:
- 运算密集型job(CUP消耗高),少用压缩
- IO密集型job(磁盘IO消耗高),多用压缩
MR支持的压缩编码
压缩方式的选择
Gzip压缩
- 优点:压缩比率较高,压缩/解压缩效率较快,Hadoop本身支持,在应用中处理.gz格式的文件就像直接处理文本一样,大部分Linux系统都自带Gzip命令,使用方便。
- 缺点:不支持Split
- 应用场景:当每个文件压缩后在一个块大小以内时,都可以考虑用Gzip压缩格式。例如一天或者一小时的日志文件
Bzip2压缩
- 优点:支持Split,具有很高的压缩比,比Gzip都高,Hadoop自带,使用方便
- 缺点:压缩/解压缩速度慢
Lzo压缩
- 优点:压缩/解压缩速度也比较快,压缩率比较合理,支持split,是Hadoop中最流行的压缩格式。可以在Linux里安装Lzop命令,使用也较为方便
- 缺点:压缩率比Gzip要低一些,Hadoop本身不支持,需要安装;在应用中,对Lzo格式的文件需要做一些特殊处理(为了支持Split需要建立索引,还需要指定InputFormat为Lzo格式)
- 应用场景:一个很大的文本文件,压缩之后还大于200M以上的可以考虑,而且单个文件越大,Lzo有点越明显
Snappy压缩
- 优点:高速压缩/解压缩速度,合理的压缩率
- 缺点:不支持Split;压缩率比Gzip要低,Hadoop本身不支持,需要安装
- 应用场景:当MR作业的Map输出的数据比较大时,作为Map到Reduce的中间数据的压缩格式,或者作为一个MR作业的输出和另外一个MR作业的输入
压缩位置的选择
各阶段采用压缩时,压缩参数的配置
Map输出端采用压缩
Driver:
conf.setBoolean("mapreduce.map.output.compress", true);
conf.setClass("mapreduce.map.output.compress.codec", BZip2Codec.class,CompressionCodec.class);
其余不变
Reduce输出端采用压缩
Driver:
FileOutputFormat.setCompressOutput(job, true);
FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);
|