7.2.3 在MapReduce程序中使用压缩
在MapReduce程序中使用压缩非常简单,只需在它进行Job配置时配置好conf就可以了。
设置Map处理后压缩数据的代码示例如下:
JobConf conf=new Jobconf();
conf.setBoolean("mapred.compress.map.output",true);
设置output输出压缩的代码示例如下:
JobConf conf=new Jobconf();
conf.setBoolean("mapred.output.compress",true);
conf.setClass("mapred.output.compression.codec",GzipCodec.class, CompressionCodec.class);
对一般情况而言,压缩总是好的,无论是对最终结果的压缩还是对Map处理后的中间数据进行压缩。对Map而言,它处理后的数据都要输出到硬盘上并经过网络传输,使用数据压缩一般都会加快这一过程。对最终结果的压缩不单会加快数据存储的速度,也会节省硬盘空间。
下面我们做一个实验来看看在MapReduce中使用压缩与不使用压缩的效率差别。
先来叙述一下我们的实验环境:这是由六台主机组成的一个小集群(一台Master,三台Salve)。输入文件为未压缩的大约为300MB的文件,它是由随机的英文字符串组成的,每个字符串都是5位的英文字母(大小写被认为是不同的),形如“AdEfr”,以空格隔开,每50个一行,共50 000 000个字符串。对这个文件进行WordCount。Map的输出压缩采用默认的压缩算法,output的输出采用Gzip压缩方法,我们关注的内容是程序执行的速度差别。
执行压缩操作的WordCount程序与基本的WordCount程序相似,只需在conf设置时写入以下几行代码:
conf.setBoolean("mapred.compress.map.output",true);
conf.setBoolean("mapred.output.compress",true);
conf.setIfUnset("mapred.output.compression.type","BLOCK");
c o n f.s e t C l a s s("m a p r e d.o u t p u t.c o m p r e s s i o n.c o d e c",G z i p C o d e c.c l a s s,
CompressionCodec.class);
下面分别执行编译打包两个程序,在运行时用time命令记录程序的执行时间,如下所示:
time bin/hadoop jar WordCount.jar WordCount XWTInput xwtOutput
real 12m41.308s
time bin/hadoop jar CompressionWordCount.jar CompressionWordCount XWTInput
xwtOutput2
real 8m9.714s
CompressionWordCount. jar是带压缩的WordCount程序的打包,从上面可以看出执行压缩的程序要比不压缩的程序快4分钟,或者说,在这个实验环境下,使用压缩会使WordCount效率提高大约三分之一。