《Hadoop权威指南:大数据的存储与分析》—5.2.3 在MapReduce中使用压缩

举报
清华大学出版社 发表于 2019/10/12 18:47:22 2019/10/12
【摘要】 本节书摘来自清华大学出版社《Hadoop权威指南:大数据的存储与分析》一书中第五章,第5.2.3节,作者是Tom White , 王 海 华 东 刘 喻 吕粤海 译。

5.2.3  MapReduce中使用压缩

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

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


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

public class MaxTemperatureWithCompression {

 

  public static void main(String[] args) throws IOException {

    if (args.length != 2) {

      System.err.println("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.out put.fileoutputformat.compress.type属性来控制限制使用压缩格式。默认值是RECORD,即针对每条记录进行压缩。如果将其改为BLOCK,将针对一组记录进行压缩,这是推荐的压缩策略,因为它的压缩效率更高(参见5.4.1)

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

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

5-5. MapReduce的压缩属性

属性名称

类型

默认值

描述

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

顺序文件输出可以使用的压缩类型:NONERECORDBLOCK

map任务输出进行压缩

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

5-6. 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(参见附录D)JobConf对象中可以通过更便捷的方法实现该功能:

conf.setCompressMapOutput(true);

conf.setMapOutputCompressorClass(GzipCodec.class);


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。