0


Hadoop3教程(二十一):MapReduce中的压缩

文章目录

(123)压缩概述

压缩也是MR中比较重要的一环,其可以应用于Map阶段,比如说Map端输出的文件,也可以应用于Reduce阶段,如最终落地的文件。

压缩的好处,是减少磁盘的IO以及存储空间。缺点也很明显,就是极大增加了CPU的开销(频繁计算带来的频繁压缩与解压缩)。

压缩的基本原则:

  • 对运算密集型job,少用压缩;(计算时需要解压缩,计算完需要压缩,受不了)
  • 对IO密集型Job,多用压缩。

MR支持很多种压缩算法,常用的有以下几个:
压缩格式Hadoop自带?算法文件扩展名是否可切片换成压缩格式后,原来的程序是否需要修改DEFLATE是,直接使用DEFLATE.deflate否和文本处理一样,不需要修改Gzip是,直接使用DEFLATE.gz否和文本处理一样,不需要修改bzip2是,直接使用bzip2.bz2是和文本处理一样,不需要修改LZO否,需要安装LZO.lzo是需要建索引,还需要指定输入格式Snappy是,直接使用Snappy.snappy否和文本处理一样,不需要修改
支持切片的话,使用上会更方便很多。

压缩性能的比较如下:
压缩算法原始文件大小压缩文件大小压缩速度解压速度gzip8.3GB1.8GB17.5MB/s58MB/sbzip28.3GB1.1GB2.4MB/s9.5MB/sLZO8.3GB2.9GB49.3MB/s74.6MB/s
据说最好的还是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引入了编码/解码器
压缩格式对应的编码/解码器DEFLATEorg.apache.hadoop.io.compress.DefaultCodecgziporg.apache.hadoop.io.compress.GzipCodecbzip2org.apache.hadoop.io.compress.BZip2CodecLZOcom.hadoop.compression.lzo.LzopCodecSnappyorg.apache.hadoop.io.compress.SnappyCodec
要在Hadoop中启用压缩,可以配置如下参数
参数默认值阶段建议io.compression.codecs (在core-site.xml中配置)无,这个需要在命令行输入hadoop checknative查看输入压缩Hadoop使用文件扩展名判断是否支持某种编解码器mapreduce.map.output.compress(在mapred-site.xml中配置)falsemapper输出这个参数设为true启用压缩mapreduce.map.output.compress.codec(在mapred-site.xml中配置)org.apache.hadoop.io.compress.DefaultCodecmapper输出企业多使用LZO或Snappy编解码器在此阶段压缩数据mapreduce.output.fileoutputformat.compress(在mapred-site.xml中配置)falsereducer输出这个参数设为true启用压缩mapreduce.output.fileoutputformat.compress.codec(在mapred-site.xml中配置)org.apache.hadoop.io.compress.DefaultCodecreducer输出使用标准工具或者编解码器,如gzip和bzip2
抄一下案例。

如何在Map输出端启用压缩

假如想Mapper输出端启用压缩,只需要调整驱动类即可,Mapper和Reducer类不需要做特殊处理,跟正常一样就可以。

packagecom.atguigu.mapreduce.compress;importjava.io.IOException;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.io.compress.BZip2Codec;importorg.apache.hadoop.io.compress.CompressionCodec;importorg.apache.hadoop.io.compress.GzipCodec;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;publicclassWordCountDriver{publicstaticvoidmain(String[] args)throwsIOException,ClassNotFoundException,InterruptedException{Configuration conf =newConfiguration();// 开启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,newPath(args[0]));FileOutputFormat.setOutputPath(job,newPath(args[1]));boolean result = job.waitForCompletion(true);System.exit(result ?0:1);}}

如何在Reduce端启用压缩

假如想Reducer输出端启用压缩:

packagecom.atguigu.mapreduce.compress;importjava.io.IOException;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.io.compress.BZip2Codec;importorg.apache.hadoop.io.compress.DefaultCodec;importorg.apache.hadoop.io.compress.GzipCodec;importorg.apache.hadoop.io.compress.Lz4Codec;importorg.apache.hadoop.io.compress.SnappyCodec;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;publicclassWordCountDriver{publicstaticvoidmain(String[] args)throwsIOException,ClassNotFoundException,InterruptedException{Configuration conf =newConfiguration();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,newPath(args[0]));FileOutputFormat.setOutputPath(job,newPath(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);}}

参考文献

  1. 【尚硅谷大数据Hadoop教程,hadoop3.x搭建到集群调优,百万播放】

本文转载自: https://blog.csdn.net/wlh2220133699/article/details/133896349
版权归原作者 经年藏殊 所有, 如有侵权,请联系我们删除。

“Hadoop3教程(二十一):MapReduce中的压缩”的评论:

还没有评论