Hadoop压缩之CompressionCodecFactory

1.CompressionCodecFactory简介

当在读取一个压缩文件的时候,可能并不知道压缩文件用的是哪种压缩算法,那么无法完成解压任务。在Hadoop中,CompressionCodecFactory通过使用其getCodec()方法,可以通过文件扩展名映射到一个与其对应的CompressionCodec类,如README.txt.gz通过getCodec()方法后,GipCodec类。关于Hadoop的压缩,可以参考我的博文《Hadoop压缩http://www.cnblogs.com/robert-blue/p/4155710.html

实例:使用由文件扩展名推断而来的codec来对文件进行解压缩

  1 package cn.roboson.codec;
  2
  3 import java.io.IOException;
  4
  5 import org.apache.hadoop.conf.Configuration;
  6 import org.apache.hadoop.fs.FSDataInputStream;
  7 import org.apache.hadoop.fs.FSDataOutputStream;
  8 import org.apache.hadoop.fs.FileStatus;
  9 import org.apache.hadoop.fs.FileSystem;
 10 import org.apache.hadoop.fs.Path;
 11 import org.apache.hadoop.io.IOUtils;
 12 import org.apache.hadoop.io.compress.CompressionCodec;
 13 import org.apache.hadoop.io.compress.CompressionCodecFactory;
 14 import org.apache.hadoop.io.compress.CompressionInputStream;
 15
 16 /*
 17  * 通过CompressionCodeFactory推断CompressionCodec
 18  * 1.先从本地上传一个.gz后缀的文件到Hadoop
 19  * 2.通过文件后缀推断出所用的压缩算法
 20  * 3.解压上传的压缩文件到统一个目录下
 21  */
 22 public class StreamCompressor02 {
 23
 24     public static void main(String[] args) {
 25
 26         Configuration conf = new Configuration();
 27         conf.addResource("core-site.xml");
 28
 29         try {
 30             FileSystem fs = FileSystem.get(conf);
 31
 32             //本地文件
 33             String localsrc="/home/roboson/桌面/README.txt.gz";
 34             Path localPath= new Path(localsrc);
 35
 36             //目的处路径
 37             String hadoopdsc="/roboson/README.txt.gz";
 38             Path hadoopPath = new Path(hadoopdsc);
 39
 40             //复制前/roboson目录下的文件列表
 41             FileStatus[] files = fs.listStatus(new Path("/roboson/"));
 42             System.out.println("复制前:");
 43             for (FileStatus fileStatus : files) {
 44                 System.out.println(fileStatus.getPath());
 45             }
 46
 47             //复制本地文件到Hadoop文件系统中
 48             fs.copyFromLocalFile(localPath,hadoopPath);
 49
 50             //复制后/roboson目录下的文件列表
 51             files = fs.listStatus(new Path("/roboson/"));
 52             System.out.println("复制后:");
 53             for (FileStatus fileStatus : files) {
 54                 System.out.println(fileStatus.getPath());
 55             }
 56
 57             //获得一个CompressionCodecFactory实例来推断哪种压缩算法
 58             CompressionCodecFactory facotry = new CompressionCodecFactory(conf);
 59
 60             //通过CompressionCodecFactory推断出一个压缩类,用于解压
 61             CompressionCodec codec =facotry.getCodec(hadoopPath);
 62             if(codec==null){
 63                 System.out.println("没有找到该类压缩");
 64                 System.exit(1);
 65             }
 66
 67             /*
 68              * 1.CompressionCodecFactory的removeSuffix()用来返回一个文件名,这个文件名==压缩文件的后缀名去掉
 69              * 如README.txt.gz调用removeSuffix()方法后,返回的是README.txt
 70              *
 71              * 2.CompressionCodec的getDefaultExtension()方法返回的是一个压缩算法的压缩扩展名,如gzip的是.gz
 72              */
 73             String uncodecUrl=facotry.removeSuffix(hadoopdsc, codec.getDefaultExtension());
 74             System.out.println("压缩算法的生成文件的扩展名:"+codec.getDefaultExtension());
 75             System.out.println("解压后生成的文件名:"+uncodecUrl);
 76
 77             //在Hadoop中创建解压后的文件
 78             FSDataOutputStream out = fs.create(new Path(uncodecUrl));
 79
 80             //创建输入数据流,并用CompressionCodec的createInputStream()方法,将输入数据流中读取的数据解压
 81             FSDataInputStream in = fs.open(new Path(hadoopdsc));
 82             CompressionInputStream codecIn = codec.createInputStream(in);
 83
 84             //将输入数据流写入到 输出数据流
 85             IOUtils.copyBytes(codecIn, out, conf,true);
 86
 87             //解压后/roboson目录下的文件列表
 88             files = fs.listStatus(new Path("/roboson/"));
 89             System.out.println("解压后");
 90             for (FileStatus fileStatus : files) {
 91                 System.out.println(fileStatus.getPath());
 92             }
 93
 94             //查看解压后的内容
 95             System.out.println("解压后的内容:");
 96             in=fs.open(new Path(uncodecUrl));
 97             IOUtils.copyBytes(in,System.out, conf,true);
 98         } catch (IOException e) {
 99             // TODO Auto-generated catch block
100             e.printStackTrace();
101         }
102     }
103 }

运行结果:

2.原生类库

什么是 原生类库?就是本地类库(native),例如,Java也有实现的压缩和解压,但是如上所示,用到的gzip并非java实现,而是Linux系统自带的,我们都知道gzip是Linux中常用的压缩工具。Hadoop本身包含有32位和64位Linux构建的压缩代码库(位于lib/native目录)。对于其它平台,需要根据Hadoop wiki的指令更具需要来编译代码库。

可以通过Java系统的java.library.path属性来指定原生代码库。bin文件夹中的hadoop脚本可以设置这个属性。默认情况下,Hadoop会根据自身运行的平台搜索原生代码库,如果找到相应的代码库就会自动加载。所以,无需为了使用原声代码库而修改任何设置。还有为了性能,最好使用原生类库来实现压缩和解压缩,因为效率更高!Hadoop中的压缩哪些是原生实现的,哪些是Java实现的?

压缩代码库的实现
压缩格式 Java实现 原生实现
DEFLATE
gzip
gzip2
LZO

时间: 2024-10-18 18:29:05

Hadoop压缩之CompressionCodecFactory的相关文章

Hadoop压缩解压缩

数据从外部进入Map时,可能这个文件是压缩的,对于常见的压缩不用关心,Map内部都是内置支持的. 当Map执行完成,产生输出到Reduce的时,这时候需要经过一个Shuffer过程,需要传输,十分消耗网络资源,那么在这种情况下数据传输量越小越好. 这时候我们可以对Map的输出进行压缩以减少文件的大小,减少传输量. Reduce输出也可以做压缩 说明,可分割性: 如果文件不可分割,意味着整个文件将作为输入源处理.不能分割的话 即使一个T的数据也会将交给一个map处理 如何支持Map段的输出和Red

hadoop压缩框架

一般来说,计算机处理的数据都存在一些冗余度,同时数据中间,尤其是相邻数据间存在着相关性,所以可以通过一些有别于原始编码的特殊编码方式来保存数据,使数据占用的存储空间比较小,这个过程一般叫压缩.和压缩对应的概念是解压缩,就是将被压缩的数据从特殊编码方式还原为原始数据的过程. 压缩广泛应用于海量数据处理中,对数据文件进行压缩,可以有效减少存储文件所需的空间,并加快数据在网络上或者到磁盘上的传输速度.在Hadoop中,压缩应用于文件存储.Map阶段到Reduce阶段的数据交换(需要打开相关的选项)等情

hadoop压缩与解压

1 压缩 一般来说,计算机处理的数据都存在一些冗余度,同时数据中间,尤其是相邻数据间存在着相关性,所以可以通过一些有别于原始编码的特殊编码方式来保存数据, 使数据占用的存储空间比较小,这个过程一般叫压缩.和压缩对应的概念是解压缩,就是将被压缩的数据从特殊编码方式还原为原始数据的过程. 压缩广泛应用于海量数据处理中,对数据文件进行压缩,可以有效减少存储文件所需的空间,并加快数据在网络上或者到磁盘上的传输速度.在Hadoop中,压缩应用于文件存储.Map阶段到Reduce阶段的数据交换(需要打开相关

十七、hadoop压缩相关

一.数据压缩在hadoop中的意义 1.基本概述 ? 压缩技术可以减少底层hdfs的读写字节数.并且能够降低在数据传输过程中占用的网络带宽资源,以及降低占用的磁盘空间.而在MapReduce中,shuffle以及merge过程都面临着巨大的IO压力.但是要注意增加了压缩,另外一方面会增加cpu的负载.所以在要权衡好是否采用压缩,以及采用的压缩算法的特性. 2.压缩应用基本原则 运算密集型的job,少用压缩.因为压缩占用cpu.IO密集型的job,可用压缩减少数据量.选择压缩算法时,要注意压缩比,

Hadoop压缩codec

简介 codec其实就是coder和decoder两个单词的词头组成的缩略词.CompressionCodec定义了压缩和解压缩接口,我们这里讲的codec就是实现了CompressionCodec接口的一些压缩格式的类,下面就是这些类的列表: 使用CompressionCodecs解压缩 CompressionCodec有两个方法可以方便的压缩和解压: 压缩:通过createOutputStream(OutputStream out)方法获得CompressionOutputStream对象.

Hadoop压缩之MapReduce中使用压缩

1.压缩和输入分片 Hadoop中文件是以块的形式存储在各个DataNode节点中,假如有一个文件A要做为输入数据,给MapReduce处理,系统要做的,首先从NameNode中找到文件A存储在哪些DataNode中,然后,在这些DataNode中,找到相应的数据块,作为一个单独的数据分块,作为map任务的输入,这就是mapreduce处理的数据的粗略过程!但是,我们都知道,对于一些大型的数据,压缩是很有用的,不仅能够节省存储空间,而且还能够加快传输速率.把文件压缩后再存入数据节点中,这个很常见

Hadoop序列化与压缩

传统的的计算机系统通过I/O操作与外界交流,,Hadoop的I/O由传统的I/O系统发展而来,但是又有些不同,Hadoop需要处理P.T级别的数据,所以在org.apache.hadoop.io包中包含了一些面向海量数据处理的基本输入输出工具,本文会对其中的序列化和压缩进行研究. 1 序列化 对象的序列化用于将对象编码成一个字节流,以及从字节流中重新构建对象.将一个对象编码成一个字节流称为序列化对象(Serializing),相反的处理过程称为反序列化. 序列化有三种主要的用途: A.作为一种持

如何读取Hadoop中压缩的文件

最近在处理离线数据导入HBase的问题,涉及从Hdfs中读取gz压缩文件,把思路记录下来,以作备用.具体代码如下: package org.dba.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import org.apache.hadoop.conf.Configuration; impo

Hadoop技术内幕HDFS-笔记4之压缩

1.1.  压缩 减少存储空间,加快传输速率 在hadoop中,压缩应用于文件存储.Map端到Reduce端的数据交换等情景. hadoop,主要考虑压缩速率和压缩文件的可分割性 压缩算法:时间和空间的权衡 更快的压缩和解压缩效率通常压缩比较低. hadoop提供了对压缩算法的编码和解码器类 编码和解码示例(采用gzip) package test; import java.io.File; import java.io.FileInputStream; import java.io.FileO