压缩策略和原则
1、压缩是提高Hadoop运行效率的优化策略。
通过对Mapper和Reduce运行过程的数据压缩,以减少磁盘I/O,以提高MR程序的运行速度。
注意:采用压缩技术减少了磁盘I/O,但也给CPU的运算增加了负担,所以压缩技术运用的当能提高性能,但运用不当也会降低性能。
压缩的基本原则:
(1)、运算密集型的JOb,少用压缩技术
(2)、I/O密集型的JOb,多用压缩技术
2、MR支持的压缩编码
为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器:
压缩方式的选择
1、Gzip压缩
优点:效率高,且压缩/解压速度块,Hadoop本身支持,大部分Linux系统都自带Gzip命令,使用方便。
缺点:不支持Split
应用:每个文件压缩之后在130M以内,都可以用Gzip
2、、Bzip2压缩
优点:支持Split,压缩率高,比Gzip压缩率还高,hadoop本身支持。
缺点:压缩/解压速度慢。
应用:速度要求不高,压缩率高的时候。
3、Lzo压缩
优点:压缩/解压速度块,合理的压缩率,支持Split,是Hadoop中最流行的压缩格式。
缺点:压缩率比Gzip要低,hadoop本身不支持,在应用中对Lzo格式的文件需要做一些特殊处理(为了支持Split,需要建索引,还需要指定InputFormat为Lzo格式)。
应用:文件大,压缩之后还大于200M以上,文件越大,Lzo优势越明显。
4、Snappy压缩
优点:速度快,合理的压缩率。
缺点:不支持Split,压缩率比Gzip要低,Hadoop本身不支持。
应用:当MapReduce作业的Map输出的数据比较大的时候,作为Map到Reduce中间数据的压缩格式,或者作为一个MapReduce作业的输出和另外一个MapReduce作业的输入。
压缩位置的选择
Map输出端到Reduce输入端采用压缩
在Drive类中添加几个设置:
//开启Map端输出压缩
configuration.setBoolean("mapreduce.map.output.compress", true);
//设置map端输出压缩方式
configuration.setclass("mapreduce.map.output.compress.codec",BZip2Codec.class, CompressionCodec.class);
Reduce输出端采用压缩
在Drive类中添加几个设置:
//设置Reduce端输出压缩开启
FileOutputFormat.setCompressOutput(job,true);
//设置Reduce端输出压缩方式
FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);