要想压缩MapReduce作业的输出,应在作业配置过程中将mapreduce.output.fileoutputformat.compress属性设为true,将mapreduce.output.fileoutputformat.compress.codec属性设置为打算使用的压缩codec的类名。另一种方案是在FileOutputFormat中使用更便捷的方法设置这些属性,如以下范例,对查找最高气温作业所产生输出进行压缩:
public class MaxTemperatureWithCompression {
public static void main(String[] args) throws IOException {
if (args.length != 2) {
System.err.printIn("Usage:MaxTemperatureWithCompression <input path> " + "<output.path>");
System.exit(-1);
}
Job job = new Job();
job.setJarByClass(MaxTemperature.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileOutputFormat.setCompressOutput(job, true);
FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);
job.setMapperClass(MaxTemperatureMapper.class);
job.setCombinerClass(MaxTemperatureReducer.class);
job.setReducerClass(MaxTemperatureReducer.class);
System.exit(job.waitForCompletion(true) ?0:1);
}
}
我们按照如下指令对压缩后的输入运行程序(输出数据不必使用相同的压缩格式进行压缩,尽管本例中不是这样):
% hadoop MaxTemperatureWithCompression input/ncdc/sample.txt.gz output
最终输出的每个部分都是经过压缩的。在这里,只有一部分结果:
% gunzip -c output/part-r-00000.gz
1949 111
1950 22
如果为输出生成顺序文件(sequence file),可以设置mapreduce.output.fileoutputformat.compress.type属性来控制限制使用压缩格式。默认值是RECORD,即针对每条记录进行压缩。如果将其改为BLOCK,将针对一组记录进行压缩,这是推荐的压缩策略,因为它的压缩效率更高。
SequenceFileOutputFormat类另外还有一个静态方法putCompressionType(),可以用来便捷地设置该属性。
下表归纳了用于设置MapReduce作业输出的压缩格式的配置属性。如果你的MapReduce驱动使用Tool接口,则可以通过命令行将这些属性传递给程序,这比通过程序代码来修改压缩属性更加便捷。
属性名称 | 类型 | 默认值 | 描述 |
---|---|---|---|
mapreduce.output.fileoutputformat.compress | boolean | false | 是否压缩输出 |
mapreduce.output.fileoutputformat.compress.codec | 类名称 | org.apache.hadoop.io.compress.DefaultCodec | map输出所用的压缩codec |
mapreduce.output.fileoutputformat.compress.type | String | RECORD | 顺序文件输出可以使用的压缩类型:NONE、RECORD或者BLOCK |
对map任务输出进行压缩
尽管MapReduce应用读/写的是未经压缩的数据,但如果对map阶段的中间输入进行压缩,也可以获得不少好处。由于map任务的输出需要写到磁盘并通过网络传输到reducer节点,所以通过使用LZO、LZ4或者Snappy这样的快速压缩方式,是可以获得性能提升的,因为需要传输的数据减少了。启用map任务输出压缩和设置压缩格式的配置属性如下表所示:
属性名称 | 类型 | 默认值 | 描述 |
---|---|---|---|
mapreduce.map.output.compress | boolean | false | 是否对map任务输出进行压缩 |
mapreduce.map.output.compress.codec | Class | org.apache.hadoop.io.compress.DefaultCodec | map输出所用的压缩codec |
下面是在作业中启用map任务输出gzip压缩格式的代码(使用新API):
Configuration conf = new Configuration();
conf.setBoolean(Job.MAP_OUTPUT_COMPRESS, true);
conf.setClass(Job.MAP_OUTPUT_COMPRESS_CODEC, GzipCodec.class, CompressionCodec.class);
Job job = new Job(conf);
在旧的API中,JobConf对象中可以通过更便捷的方法实现该功能:
conf.setCompressMapOutput(true);
conf.setMapOutputCompressorClass(GzipCodec.class);
完毕。