在MapReduce的Shuffle阶段,可以看到数据通过大量的拷贝,从map阶段输出的数据,都要通过网络拷贝,发送到reduce阶段,这一过程中,涉及到大量的网络IO,如果数据能够进行压缩,那么数据的发送量就会少得多,那么如何配置hadoop的文件压缩呢,以及hadoop当中的文件压缩支持哪些压缩算法呢?
1、hadoop当中支持的压缩算法
文件压缩有两大好处,节约磁盘空间,加速数据在网络和磁盘上的传输
前面我们的hadoop的版本经过我们重新编译之后,我们可以看到我们的hadoop已经支持所有的压缩格式了,剩下的问题就是我们该如何选择使用这些压缩格式来对我们的MapReduce程序进行压缩。
我们可以使用 bin/hadoop checknative 来查看我们编译之后的hadoop支持的各种压缩,如果出现openssl为false,那么就在线安装一下依赖包:
bin/hadoop checknative
yum install openssl-devel
[hadoop@node01 hadoop-2.6.0-cdh5.14.2]$ bin/hadoop checknative
20/08/11 17:11:36 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
20/08/11 17:11:36 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop: true /xsluo/install/hadoop-2.6.0-cdh5.14.2/lib/native/libhadoop.so.1.0.0
zlib: true /lib64/libz.so.1
snappy: true /lib64/libsnappy.so.1
lz4: true revision:10301
bzip2: true /lib64/libbz2.so.1
openssl: true /lib64/libcrypto.so
hadoop支持的压缩算法
压缩格式 工具 算法 文件扩展名 是否可切分
DEFLATE 无 DEFLATE .deflate 否
Gzip gzip DEFLATE .gz 否
bzip2 bzip2 bzip2 bz2 是
LZO lzop LZO .lzo 否
LZ4 无 LZ4 .lz4 否
Snappy 无 Snappy .snappy 否
各种压缩算法对应使用的java类
压缩格式 对应使用的java类
DEFLATE org.apache.hadoop.io.compress.DeFaultCodec
gzip org.apache.hadoop.io.compress.GZipCodec
bzip2 org.apache.hadoop.io.compress.BZip2Codec
LZO com.hadoop.compression.lzo.LzopCodec
LZ4 org.apache.hadoop.io.compress.Lz4Codec
Snappy org.apache.hadoop.io.compress.SnappyCodec
常见的压缩速率比较
压缩算法 原始文件大小 压缩后的文件大小 压缩速度 解压缩速度
gzip 8.3GB 1.8GB 17.5MB/s 58MB/s
bzip2 8.3GB 1.1GB 2.4MB/s 9.5MB/s
LZO-bset 8.3GB 2GB 4MB/s 60.6MB/s
LZO 8.3GB 2.9GB 135 MB/s 410 MB/s
snappy 8.3GB 1.8GB 172MB/s 409MB/s
在生产环境中常用的压缩算法主要有LZO和snappy等
2、如何开启我们的压缩?
方式一:在代码中进行设置压缩
//设置我们的map阶段的压缩
Configuration configuration = new Configuration();
configuration.set(“mapreduce.map.output.compress”,“true”);
configuration.set(“mapreduce.map.output.compress.codec”,“org.apache.hadoop.io.compress.SnappyCodec”);
//设置我们的reduce阶段的压缩
configuration.set(“mapreduce.output.fileoutputformat.compress”,“true”);
configuration.set(“mapreduce.output.fileoutputformat.compress.type”,“RECORD”);
configuration.set(“mapreduce.output.fileoutputformat.compress.codec”,“org.apache.hadoop.io.compress.SnappyCodec”);
方式二:修改mapred-site.xml进行MapReduce压缩
我们可以修改mapred-site.xml配置文件,然后重启集群,以便对所有的mapreduce任务进行压缩
map输出数据进行压缩:
mapreduce.map.output.compress true mapreduce.map.output.compress.codec org.apache.hadoop.io.compress.SnappyCodec reduce输出数据进行压缩: mapreduce.output.fileoutputformat.compress true mapreduce.output.fileoutputformat.compress.type RECORD mapreduce.output.fileoutputformat.compress.codec org.apache.hadoop.io.compress.SnappyCodec3、使用hadoop的snappy压缩来对我们的数据进行压缩
这里我们通过修改代码的方式来实现数据的压缩:
//map阶段输出压缩配置
Configuration configuration = new Configuration();
configuration.set(“mapreduce.map.output.compress”,“true”);
configuration.set(“mapreduce.map.output.compress.codec”,“org.apache.hadoop.io.compress.SnappyCodec”);
//reduce阶段输出压缩配置
configuration.set(“mapreduce.output.fileoutputformat.compress”,“true”);
configuration.set(“mapreduce.output.fileoutputformat.compress.type”,“RECORD”);
configuration.set(“mapreduce.output.fileoutputformat.compress.codec”,“org.apache.hadoop.io.compress.SnappyCodec”);
重新打包测试mr程序,
会发现我们的MR运行之后的输出文件都变成了以.snappy的压缩文件。