Hadoop 压缩文件方式比较

简介:

 对于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





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/879179,如需转载请自行联系原作者

目录
相关文章
|
4天前
|
存储 分布式计算 Hadoop
大数据之hadoop3入门到精通(一)
大数据之hadoop3入门到精通(一)
|
1月前
|
存储 分布式计算 Hadoop
大数据处理架构Hadoop
【4月更文挑战第10天】Hadoop是开源的分布式计算框架,核心包括MapReduce和HDFS,用于海量数据的存储和计算。具备高可靠性、高扩展性、高效率和低成本优势,但存在低延迟访问、小文件存储和多用户写入等问题。运行模式有单机、伪分布式和分布式。NameNode管理文件系统,DataNode存储数据并处理请求。Hadoop为大数据处理提供高效可靠的解决方案。
120 2
|
1月前
|
分布式计算 Hadoop 大数据
大数据技术与Python:结合Spark和Hadoop进行分布式计算
【4月更文挑战第12天】本文介绍了大数据技术及其4V特性,阐述了Hadoop和Spark在大数据处理中的作用。Hadoop提供分布式文件系统和MapReduce,Spark则为内存计算提供快速处理能力。通过Python结合Spark和Hadoop,可在分布式环境中进行数据处理和分析。文章详细讲解了如何配置Python环境、安装Spark和Hadoop,以及使用Python编写和提交代码到集群进行计算。掌握这些技能有助于应对大数据挑战。
|
3天前
|
分布式计算 Hadoop 分布式数据库
Hadoop生态系统介绍(二)大数据技术Hadoop入门理论系列之一----hadoop生态圈介绍
Hadoop生态系统介绍(二)大数据技术Hadoop入门理论系列之一----hadoop生态圈介绍
12 2
|
1天前
|
分布式计算 Hadoop 大数据
大数据技术:Hadoop与Spark的对比
【6月更文挑战第15天】**Hadoop与Spark对比摘要** Hadoop是分布式系统基础架构,擅长处理大规模批处理任务,依赖HDFS和MapReduce,具有高可靠性和生态多样性。Spark是快速数据处理引擎,侧重内存计算,提供多语言接口,支持机器学习和流处理,处理速度远超Hadoop,适合实时分析和交互式查询。两者在资源占用和生态系统上有差异,适用于不同应用场景。选择时需依据具体需求。
|
3天前
|
分布式计算 Hadoop 大数据
大数据--hadoop集群搭建
大数据--hadoop集群搭建
7 0
|
3天前
|
分布式计算 资源调度 监控
【大数据】Hadoop 2.X和1.X升级优化对比
【大数据】Hadoop 2.X和1.X升级优化对比
20 0
|
3天前
|
分布式计算 Hadoop 大数据
【大数据】Hadoop下载安装及伪分布式集群搭建教程
【大数据】Hadoop下载安装及伪分布式集群搭建教程
12 0
|
3天前
|
存储 分布式计算 资源调度
【大数据】大数据概论与Hadoop
【大数据】大数据概论与Hadoop
18 0

相关实验场景

更多