在 shuffle 阶段,可以看到数据通过大量的拷贝,从 map 阶段输出的数据,都要通过网络拷贝,发送到 reduce 阶段,这一过程中,涉及到大量的网络 IO,如果数据能够进行压缩,那么数据的发送量就会少得多,那么如何了解 hadoop 当中支持文件的那些压缩算法, 已经如何配置 hadoop 的文件压缩.
1 hadoop 当中支持的压缩算法
文件压缩有两大好处,节约磁盘空间,加速数据在网络和磁盘上的传输
前面我们的 hadoop 的版本经过我们重新编译之后,我们可以看到我们的 hadoop 已经支持所有的压缩格式了,剩下的问题就是我们该如何选择使用这些压缩格式来对我们的 MapReduce 程序进行压缩
我们可以使用 bin/hadoop checknative 来查看我们编译之后的 hadoop 支持的各种压缩,如果出现 openssl 为 false,那么就在线安装一下依赖包
bin/hadoop checknative
yum install openssl-devel
复制代码
2. 如何开启 hadoop 压缩
注意: hadoop 默认是不开启压缩模式的, 需要进行手动的配置, 才可以开启
对 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");
复制代码
开启的第二种方式 : 配置全局的 MapReduce 压缩
对 map 阶段的数据进行压缩:
<!--开启压缩格式-->
<property>
<name>mapreduce.map.output.compress</name>
<value>true</value>
</property>
<!--启动那种压缩格式-->
<property>
<name>mapreduce.map.output.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
对 reduce 阶段的数据进行压缩:
<!--开启压缩格式-->
<property>
<name>mapreduce.output.fileoutputformat.compress</name>
<value>true</value>
</property>
<!--控制限制使用压缩格式 : 如果使用的是SequenceFileOutputFormat 进行输出, 建议使用 BLOCK 对一组数据进行压缩, 如果使用的其他的输出类, 建议使用 RECORD(对每一条数据进行压缩)-->
<property>
<name>mapreduce.output.fileoutputformat.compress.type</name>
<value>RECORD</value>
</property>
<!--启动那种压缩格式-->
<property>
<name>mapreduce.output.fileoutputformat.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
复制代码
注意: 所有节点都要修改 mapred-site.xml,修改完成之后记得重启集群
评论