Hadoop中如何压缩Codec

40次阅读
没有评论

丸趣 TV 小编给大家分享一下 Hadoop 中如何压缩 Codec,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

作为输入

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

作为输出

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

package com.hadoop.codecs;
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;
public class CodecDemo { public static void main(String[] args) throws Exception { if (args.length!=2){ System.exit(-1);
 }
 Job job=new Job();
 job.setJarByClass(CodecDemo.class);
 job.setJobName( CodecDemo 
 FileInputFormat.addInputPath(job, new Path(args[0]));
 FileOutputFormat.setOutputPath(job, new Path(args[1]));
 job.setMapperClass(MyMapper.class);
 job.setCombinerClass(MyReducer.class);
 job.setReducerClass(MyReducer.class);
 job.setOutputKeyClass(Text.class);
 job.setOutputValueClass(LongWritable.class);
 // 设置输出压缩开启
 FileOutputFormat.setCompressOutput(job, true);
 // 设置压缩类:GzipCodec
 FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);
 System.exit(job.waitForCompletion(true)?0:1);
 }
}

Hadoop 中如何压缩 Codec

Hadoop 中如何压缩 Codec

使用 CompressionCodes 解压缩

/*
使用 CompressionCodes 解压缩 CompressionCodec 有两个方法可以方便的压缩和解压。压缩:通过 createOutputStream(OutputStream out) 方法获得 CompressionOutputStream 对象
解压:通过 createInputStream(InputStream in) 方法获得 CompressionInputStream 对象
从命令行接受一个 CompressionCodec 实现类的参数,然后通过 ReflectionUtils 把实例化这个类,调用 CompressionCodec 的接口方法对标准输出流进行封装,封装成一个压缩流,通过 IOUtils 类的 copyBytes 方法把标准输入流拷贝到压缩流中,最后调用 CompressionCodec 的 finish 方法,完成压缩。package com.hadoop.codecs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionOutputStream;
import org.apache.hadoop.util.ReflectionUtils;
public class Compressors { public static void main(String[] args) throws Exception { String codecClassName = args[0];
 Class ?  codecClass = Class.forName(codecClassName);
 Configuration conf = new Configuration();
 CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(codecClass, conf);
 CompressionOutputStream out = codec.createOutputStream(System.out);
 IOUtils.copyBytes(System.in, out, 4096, false);
 out.finish();
 }
}

使用 CompressionCodecFactory 解压缩

/*
  如果你想读取一个被压缩的文件的话,首先你得先通过扩展名判断该用哪种 codec,当然有更简便得办法,CompressionCodecFactory 已经帮你把这件事做了,通过传入一个 Path 调用它得 getCodec 方法, 即可获得相应得 codec。  注意看下 removeSuffix 方法,这是一个静态方法,它可以将文件的后缀去掉,然后我们将这个路径做为解压的输出路径。CompressionCodecFactory 能找到的 codec 也是有限的,默认只有三种 org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.DefaultCodec, 如果想添加其他的 codec 你需要更改 io.compression.codecs 属性,并注册 codec。
import org.apache.hadoop.conf.Configuration;  import org.apache.hadoop.fs.FileSystem;  import org.apache.hadoop.fs.Path;  import org.apache.hadoop.io.IOUtils;  import org.apache.hadoop.io.compress.CompressionCodec;  import org.apache.hadoop.io.compress.CompressionCodecFactory;    import java.io.IOException;  import java.io.InputStream;  import java.io.OutputStream;  import java.net.URI;    public class FileDecompressor {  public static void main(String[] args) throws Exception {  String uri = args[0];  Configuration conf = new Configuration();  FileSystem fs = FileSystem.get(URI.create(uri), conf);    Path inputPath = new Path(uri);  CompressionCodecFactory factory = new CompressionCodecFactory(conf);  CompressionCodec codec = factory.getCodec(inputPath);  if (codec == null) {  System.out.println(No codec found:  + uri);  System.exit(1);  }  String outputUri = CompressionCodecFactory.removeSuffix(uri, codec.getDefaultExtension());    InputStream in = null;  OutputStream out = null;    try {  in = codec.createInputStream(fs.open(inputPath));  out = fs.create(new Path(outputUri));  IOUtils.copyBytes(in,out,conf);  } finally {  IOUtils.closeStream(in);  IOUtils.closeStream(out);  }  }  }

以上是“Hadoop 中如何压缩 Codec”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!