对于Hadoop文件常用的几种压缩方法,我写了一个java程序进行比较。

期望是,给出一个大文件(bigfile.txt) ,我们用各种方式压缩他们然后最终复制到HDFS中。

代码很简单:就是构造codec的实例,然后让它来创建到HDFS的输出流

 
  
  1. /*  
  2.  */ 
  3. package com.charles.hadoop.fs; 
  4.  
  5. import java.io.BufferedInputStream; 
  6. import java.io.FileInputStream; 
  7. import java.io.InputStream; 
  8. import java.io.OutputStream; 
  9. import java.net.URI; 
  10.  
  11. import org.apache.hadoop.conf.Configuration; 
  12. import org.apache.hadoop.fs.FileSystem; 
  13. import org.apache.hadoop.fs.Path; 
  14. import org.apache.hadoop.io.IOUtils; 
  15. import org.apache.hadoop.io.compress.CompressionCodec; 
  16. import org.apache.hadoop.io.compress.CompressionCodecFactory; 
  17. import org.apache.hadoop.io.compress.GzipCodec; 
  18. import org.apache.hadoop.util.ReflectionUtils; 
  19.  
  20. /** 
  21.  *  
  22.  * Description: 
  23.  *  
  24.  * @author charles.wang 
  25.  * @created May 26, 2012 3:23:21 PM 
  26.  *  
  27.  */ 
  28. public class HadoopCodec { 
  29.  
  30.     /** 
  31.      * @param args 
  32.      */ 
  33.     public static void main(String[] args) throws Exception { 
  34.         // TODO Auto-generated method stub 
  35.  
  36.         String inputFile = "bigfile.txt"
  37.  
  38.         String outputFolder = "hdfs://192.168.129.35:9000/user/hadoop-user/codec/"
  39.         // String outputFile="bigfile.gz"; 
  40.  
  41.         // 读取hadoop文件系统的配置 
  42.         Configuration conf = new Configuration(); 
  43.         conf.set("hadoop.job.ugi""hadoop-user,hadoop-user"); 
  44.  
  45.         //测试各种压缩格式的效率 
  46.         //gzip 
  47.         long gzipTime = copyAndZipFile(conf, inputFile, outputFolder, "org.apache.hadoop.io.compress.GzipCodec""gz"); 
  48.         //bzip2 
  49.         long bzip2Time = copyAndZipFile(conf, inputFile, outputFolder, "org.apache.hadoop.io.compress.BZip2Codec""bz2"); 
  50.         //deflate 
  51.         long deflateTime = copyAndZipFile(conf, inputFile, outputFolder, "org.apache.hadoop.io.compress.DefaultCodec""deflate"); 
  52.          
  53.         System.out.println("被压缩的文件名为: "+inputFile); 
  54.         System.out.println("使用gzip压缩,时间为: "+gzipTime+"毫秒!"); 
  55.         System.out.println("使用bzip2压缩,时间为: "+bzip2Time+"毫秒!"); 
  56.         System.out.println("使用deflate压缩,时间为: "+deflateTime+"毫秒!"); 
  57.     } 
  58.  
  59.     public static long copyAndZipFile(Configuration conf, String inputFile, String outputFolder, String codecClassName, 
  60.             String suffixName) throws Exception { 
  61.         long startTime = System.currentTimeMillis(); 
  62.  
  63.         // 因为本地文件系统是基于java.io包的,所以我们创建一个本地文件输入流 
  64.         InputStream in = new BufferedInputStream(new FileInputStream(inputFile)); 
  65.  
  66.         //去掉扩展名提取basename 
  67.         String baseName = inputFile.substring(0, inputFile.indexOf(".")); 
  68.         //构造输出文件名,它是路径名+基本名+扩展名 
  69.         String outputFile = outputFolder + baseName + "."+suffixName; 
  70.          
  71.  
  72.         FileSystem fs = FileSystem.get(URI.create(outputFile), conf); 
  73.  
  74.         // 创建一个编码×××,通过反射机制根据传入的类名来动态生成其实例 
  75.         CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(Class.forName(codecClassName), conf); 
  76.  
  77.         // 创建一个指向HDFS目标文件的压缩文件输出流 
  78.         OutputStream out = codec.createOutputStream(fs.create(new Path(outputFile))); 
  79.         // 用IOUtils工具将文件从本地文件系统复制到HDFS目标文件中 
  80.  
  81.         try { 
  82.             IOUtils.copyBytes(in, out, conf); 
  83.  
  84.         } finally { 
  85.             IOUtils.closeStream(in); 
  86.             IOUtils.closeStream(out); 
  87.         } 
  88.  
  89.         long endTime = System.currentTimeMillis(); 
  90.  
  91.         return endTime - startTime; 
  92.     } 
  93.  

 

最终显示结果为:

 
  
  1. 被压缩的文件名为: bigfile.txt 
  2. 使用gzip压缩,时间为: 11807毫秒! 
  3. 使用bzip2压缩,时间为: 44982毫秒! 
  4. 使用deflate压缩,时间为: 3696毫秒! 

 

同时我们查看HDFS文件目录,可以证实,这几个文件的确存在:

 

分析结果:

我们可以从性能和压缩比率2个方面来进行对比:

性能:一目了然 deflate>bzip2>gzip, 而且gzip的性能差好大一截。

压缩比

我们的原文件大小为114,576,640 字节

 gzip 压缩比率为:9513416/114576640=8.3%,bzip2 压缩比率为5006568/114576640=4.37%,deflate压缩比率为9513404/114576640=8.3%

所以压缩比: bzip2>deflate=gzip

 

综上所述:压缩效果最好的是bzip2,压缩速度最快的是deflate