整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

4.2.3在MapReduce中使用压缩

hadoop 花牛 7℃ 0评论

前面讲到通过 CompressionCodecFactory 来推断 CompressionCodec 时指出,如果输入文件是压缩的,那么在根据文件扩展名推断出相应的codec 后,MapReduce会在读取文件时自动解压缩文件。

要想压缩MapReduce作业的输出,应在作业配置过程中将mapned.output.compress属性设为true 和 mapred. output, compression.codec属性设置为打算使用的压缩codec的类名。另一种方案是在FileOutputFormat中使用更便捷的方法设置这些属性,如范洳4-4所示。

范例4-4.对查找最高气温作业所产生输出进行压缩

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);
        FilelnputFormat.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),可以设置mapred.output.compression.type属性来控制限制使用压缩格式。默认值是RECORD,即针对每条记录进行压缩。如果将其改为BLOCK,将针对一组记录进行压缩,这是推荐的压缩策略,因为它的压缩效率更高。

SequenceFileOutputFormat类中还有一个静态方法 putCompressionType()可用来便捷地设置该属性。

表4-5归纳概述了用于设置MpaReduce作业输出的压缩格式的配置属性。如果你的MapReduce驱动使用Tool接口,则可以通过命令行将这些属性传递给程序,这比通过程序代码来修改压缩属性更加简便。

表4-5. MapReduce的压缩属性

属性名称

类型

默认值

描述

mapred.output,compress

boolean

false

压缩输

mapred.output.compession.codec

类名称

org.apache.hadoop.io. compress.DefaultCodec

map输出所用的压缩codec

Mapred.output.compression.type

String

RECORD

SqeuenceFile 的输出可以使用的压缩类型:NONE、RECORD或者BLOCK

map任务输出进行压缩

尽管MapReduce应用读/写的是未经压缩的数据,但如果对map阶段的中间输入进行压缩,也可以获得不少好处。由于map任务的输出需要写到磁盘并通过网络传输到reducer节点,所以如果使用LZOLZ4或者Snappy这 样的快速压缩方式,是可以获得性能提升的,因为需要传输的数据减少了。启用map任务输出压缩和设置压缩格式的配置属性如表4-6所示。

表4-6. map任务输出的压缩属性

属性名称

类型

默认值

描述

mapred.compress.map. output

boolean

false

对map任务输出进行压缩

mapred.map.output. compression.codec

Class

ong.apache.hadoop.io. compress.DefaultCodec

map输出所用的压缩codec

下面是在作业中启用map任务输出gzip压缩格式的代码(使用新API):

Configuration conf = new Configuration();
conf.setBoolean("mapred.compress.map.output", true);
conf.setClass("mapred.map.output.compression.codec",GzipCodec.class,CompressionCodec.class);
Job job = new Job(conf);

 

在旧的API中,JobConf对象中可通过更便捷的方法实现该功能:

conf.setCompressMapOutput(true);
conf.setMap0utputCompressorClass(GzipCodec.class);

转载请注明:全栈大数据 » 4.2.3在MapReduce中使用压缩

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址