Hadoop3教程(二十一):MapReduce中的压缩
最佳答案 问答题库608位专家为你答疑解惑
文章目录
- (123)压缩概述
- 在Map阶段启用
- 在Reduce阶段启用
- (124)压缩案例实操
- 如何在Map输出端启用压缩
- 如何在Reduce端启用压缩
- 参考文献
(123)压缩概述
压缩也是MR中比较重要的一环,其可以应用于Map阶段,比如说Map端输出的文件,也可以应用于Reduce阶段,如最终落地的文件。
压缩的好处,是减少磁盘的IO以及存储空间。缺点也很明显,就是极大增加了CPU的开销(频繁计算带来的频繁压缩与解压缩)。
压缩的基本原则:
- 对运算密集型job,少用压缩;(计算时需要解压缩,计算完需要压缩,受不了)
- 对IO密集型Job,多用压缩。
MR支持很多种压缩算法,常用的有以下几个:
支持切片的话,使用上会更方便很多。
压缩性能的比较如下:
据说最好的还是Google开发的snappy,其官网介绍它的压缩速度是250MB/s,解压缩速度是500MB/s。
那在生产环境下,该如何选择合适的压缩方式呢?
一般是重点考虑以下几点:
- 压缩/解压缩速度;
- 压缩率,即压缩后的文件大小;
- 压缩后是否还支持切片。
结合这几点,我们再回头看这几种压缩算法。
Gzip压缩:压缩率比较高,但是压缩/解压缩速度一般,且不支持切片;
Bzip2压缩,压缩率非常高,且支持切片,但是压缩/解压缩速度极慢;
Lzo压缩,压缩/解压缩速度非常快,且支持切片,但是压缩率一般;不过Lzo需要额外创建索引之后,才能支持切片。
Snappy压缩,压缩和解压缩速度极快,但不支持切片,压缩率一般。
压缩可以在MapReduce的任意阶段启用,一共三个阶段,即Map的输入端、Map到Reduce部分、Reduce的输出端。
在Map阶段启用
在Map的输入端启用压缩时:
不需要显式指定使用的编解码方式,Hadoop会自动通过文件扩展名,来选择合适的编解码方式。
同时,需要注意,如果数据量小于块大小的话,则可以考虑压缩、解压缩速度比较快的算法,如LZO、snappy;如果数据量大于块大小的话,则可以重点考虑支持切片的算法,如Bzip2和LZO。
在Mapper的输出端启用压缩时:
这里启用压缩,主要是为了减少MapTask和ReduceTask之间的网络IO,所以可以选择重点考虑压缩和解压缩快的LZO、snappy等。
在Reduce阶段启用
在Reducer的输出端启用压缩时:
如果输出的数据是需要永久保存,那么可以采用压缩率比较高的算法,以减少存储的空间;
如果是作为下一个MapReduce的输入,那么可以考虑数据量和是否支持切片。
(124)压缩案例实操
讲怎么写压缩代码的,此处只做了解,所以基本是直接复制教程文档。
为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器
要在Hadoop中启用压缩,可以配置如下参数
抄一下案例。
如何在Map输出端启用压缩
假如想Mapper输出端启用压缩,只需要调整驱动类即可,Mapper和Reducer类不需要做特殊处理,跟正常一样就可以。
package com.atguigu.mapreduce.compress;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.compress.BZip2Codec;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.GzipCodec;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class WordCountDriver {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {Configuration conf = new Configuration();// 开启map端输出压缩conf.setBoolean("mapreduce.map.output.compress", true);// 设置map端输出压缩方式conf.setClass("mapreduce.map.output.compress.codec", BZip2Codec.class,CompressionCodec.class);Job job = Job.getInstance(conf);job.setJarByClass(WordCountDriver.class);job.setMapperClass(WordCountMapper.class);job.setReducerClass(WordCountReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.setInputPaths(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));boolean result = job.waitForCompletion(true);System.exit(result ? 0 : 1);}
}
如何在Reduce端启用压缩
假如想Reducer输出端启用压缩:
package com.atguigu.mapreduce.compress;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.compress.BZip2Codec;
import org.apache.hadoop.io.compress.DefaultCodec;
import org.apache.hadoop.io.compress.GzipCodec;
import org.apache.hadoop.io.compress.Lz4Codec;
import org.apache.hadoop.io.compress.SnappyCodec;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class WordCountDriver {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {Configuration conf = new Configuration();Job job = Job.getInstance(conf);job.setJarByClass(WordCountDriver.class);job.setMapperClass(WordCountMapper.class);job.setReducerClass(WordCountReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.setInputPaths(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));// 设置reduce端输出压缩开启FileOutputFormat.setCompressOutput(job, true);// 设置压缩的方式FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);
// FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);
// FileOutputFormat.setOutputCompressorClass(job, DefaultCodec.class); boolean result = job.waitForCompletion(true);System.exit(result?0:1);}
}
参考文献
- 【尚硅谷大数据Hadoop教程,hadoop3.x搭建到集群调优,百万播放】
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"Hadoop3教程(二十一):MapReduce中的压缩":http://eshow365.cn/6-19957-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!