linshi0591 发表于 2014-4-4 22:33:15

hadoop深入研究:(九)---mapreduce中的压缩

本帖最后由 pig2 于 2014-4-4 23:42 编辑

mapreduce如何处理压缩文件?
当mapreduce的输出文件需要压缩时,该如何设置?
对map任务的中间输出作压缩,该设置那两种属性?

作为输入
当压缩文件做为mapreduce的输入时,mapreduce将自动通过扩展名找到相应的codec对其解压。

作为输出      

当mapreduce的输出文件需要压缩时,可以更改mapred.output.compress为true,mapped.output.compression.codec为想要使用的codec的类名就
可以了,当然你可以在代码中指定,通过调用FileOutputFormat的静态方法去设置这两个属性,我们来看代码:


package com.sweetop.styhadoop;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.compress.GzipCodec;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

/**
* Created with IntelliJ IDEA.
* User: lastsweetop
* Date: 13-6-27
* Time: 下午7:48
* To change this template use File | Settings | File Templates.
*/
public class MaxTemperatureWithCompression {
    public static void main(String[] args) throws Exception {
      if (args.length!=2){
            System.out.println("Usage: MaxTemperature <input path> <out path>");
            System.exit(-1);
      }
      Job job=new Job();
      job.setJarByClass(MaxTemperature.class);
      job.setJobName("Max Temperature");

      FileInputFormat.addInputPath(job, new Path(args));
      FileOutputFormat.setOutputPath(job, new Path(args));

      job.setMapperClass(MaxTemperatrueMapper.class);
      job.setCombinerClass(MaxTemperatureReducer.class);
      job.setReducerClass(MaxTemperatureReducer.class);

      job.setOutputKeyClass(Text.class);
      job.setOutputValueClass(IntWritable.class);

      FileOutputFormat.setCompressOutput(job, true);
      FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);

      System.exit(job.waitForCompletion(true)?0:1);

    }
}
输入也是一个压缩文件

~/hadoop/bin/hadoop com.sweetop.styhadoop.MaxTemperatureWithCompression   input/data.gzoutput/
输出的每一个part都会被压缩,我们这里只有一个part,看下压缩了的输出

$hadoop fs -get output/part-r-00000.gz .
$ls
19011902ch2ch3ch4data.gznews.gznews.txtpart-r-00000.gz
$gunzip -c part-r-00000.gz   
如果你要将序列文件做为输出,你需要设置mapred.output.compression.type属性来指定压缩类型,默认是RECORD类型,它会按单个的record压缩,如果指定为BLOCK类型,它将一组record压缩,压缩效果自然是BLOCK好。
当然代码里也可以设置,你只需调用SequenceFileOutputFormat的setOutputCompressionType方法进行设置。
SequenceFileOutputFormat.setOutputCompressionType(job, SequenceFile.CompressionType.BLOCK);如果你用Tool接口来跑mapreduce的话,可以在命令行设置这些参数,明显比硬编码好很多

压缩map输出
即使你的mapreduce的输入输出都是未压缩的文件,你仍可以对map任务的中间输出作压缩,因为它要写在硬盘并且通过网络传输到reduce节点,对其压缩可以提高很多性能,这些工作也是只要设置两个属性即可,我们看下代码里怎么设置:

    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);
转载请注明出处:http://blog.csdn.net/lastsweetop/article/details/9187721









页: [1]
查看完整版本: hadoop深入研究:(九)---mapreduce中的压缩