hadoop 压缩框架

原创
2017/05/03 09:21
阅读数 68

hadoop 压缩框架

[toc]

hadoop 常见的压缩

| 格式 | split | native |压缩率 |速度 | 是否hadoop自带 |linux命令 | 换成压缩格式后,原来的应用程序是否要修改 | | :-------- | :--------:| :------: |:--------:| :------: |:--------:| :------: | |gzip | 否| 是 |很高| 比较快| 是,直接使用| 有 |和文本处理一样,不需要修改| |lzo| 是|是 |比较高 |很快| 否,需要安装 |有| 需要建索引,还需要指定输入格式| |snappy|否| 是 |比较高 |很快| 否,需要安装| 没有| 和文本处理一样,不需要修改| |bzip2 |是 |否 |最高 |慢 | 是,直接使用 |有 |和文本处理一样,不需要修改|

压缩使用例子

public class CompressTest {
	public static void main(String[] args) throws Exception {
	    //要压缩的文件
		String name = "/Users/zwf/Downloads/BEH 7.0产品介绍-20161226.pptx";
		/**
		* 指定压缩方式可用的有:
		* 1. org.apache.hadoop.io.compress.DefaultCodec
		* 2. org.apache.hadoop.io.compress.GzipCodec
		* 3. org.apache.hadoop.io.compress.Bzip2Codec
		* 4. org.apache.hadoop.io.compress.LzopCodec
		* 5. org.apache.hadoop.io.compress.SnappyCodec
		**/
		compress("org.apache.hadoop.io.compress.DefaultCodec", name);
		decompress(name+".deflate");
	}
	//压缩过程
	public static void compress(String method ,String filename) throws Exception {

		File inFile = new File(filename);
		System.out.println(inFile.getTotalSpace());
		InputStream in = new FileInputStream(inFile);
		Configuration conf = new Configuration();
		//加载类,反射获取实例
		CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(Class.forName(method), conf);
		File outFile = new File(filename + codec.getDefaultExtension());
		CompressionOutputStream cout = codec.createOutputStream(new FileOutputStream(outFile));
		IOUtils.copyBytes(in,cout,1000,false);
		in.close();
		cout.close();
		System.out.println(outFile.getTotalSpace()/1024/1024);
	}
	//解压缩过程
	public static void decompress(String filename) throws Exception {
		
		File inFile = new File(filename);
		CompressionCodecFactory factory = new CompressionCodecFactory(new Configuration());
		//根据文件名后缀获取对应的压缩方式
		CompressionCodec codec = factory.getCodec(new Path(filename));
		if(codec == null) {
			System.out.println("connot found codec for file " + filename);
			return;
		}
		InputStream in = codec.createInputStream(new FileInputStream(inFile));
		File outFile = new File(filename + ".txt");
		OutputStream out = new FileOutputStream(outFile);
		IOUtils.copyBytes(in,out,1000,false);
		in.close();
		out.close();
		
		System.out.println(outFile.getTotalSpace()/1024/1024);
	}
	
}

主要类

CompressionCodec

主要功能: 定义了压缩,和解压缩调用的方法 主要实现: Lz4Codec ,GzipCodec,SnappyCodec ,BZip2Codec等 主要方法:

    // 在底层输出流 out 的基础上创建 对应压缩算法的压缩流 CompressionOutputStream  象
    CompressionOutputStream createOutputStream(OutputStream out) throws IOException;
    CompressionOutputStream createOutputStream(OutputStream out, Compressor compressor) throws IOException;
    //获取本地压缩是否可用,返回压缩实现类
    Class<? extends Compressor> getCompressorType()
    Class<? extends Decompressor> getDecompressorType()
    //获取解压缩使用的输入流
    CompressionInputStream createInputStream(InputStream in) throws IOException;
    CompressionInputStream createInputStream(InputStream in,  Decompressor decompressor) throws IOException;
    // 创建压缩算法对应的压缩器
    Compressor createCompressor();
    Decompressor createDecompressor();
    //获取压缩算法对应的文件名后缀
    String getDefaultExtension();

CompressionCodecFactory

主要功能: CompressionCodec 的工厂,构造函数中初始化了一下存储现有压缩算法的实例,主要保存了

    {
       2zb.: org.apache.hadoop.io.compress.BZip2Codec,
       etalfed.: org.apache.hadoop.io.compress.DeflateCodec,
       yppans.: org.apache.hadoop.io.compress.SnappyCodec,
       zg.: org.apache.hadoop.io.compress.GzipCodec
    }

Compressor

主要功能:定义了压缩使用的接口方法, 提供数据压缩功能。不同压缩都有对应的实现 主要方法:

    //把数据放到压缩其中, off 指定从数字b的开始位置, len指定读取数据长度
    public void setInput(byte[] b, int off, int len);
    //判断压缩器是否能继续输入,如果不能表示需要开始压缩数据,
    public boolean needsInput();

    public void setDictionary(byte[] b, int off, int len);
    //返回已经压缩了的数据压缩前长度
    public long getBytesRead();
    
    //返回已经压缩了的数据压缩后长度
    public long getBytesWritten();
    //结束数据输入的过程
    public void finish();
   //判断压缩器中是否还有未压缩数据
    public boolean finished();
    //开始压缩数据
    public int compress(byte[] b, int off, int len) throws IOException;
    //重置压缩器
    public void reset();
   //关闭压缩器
    public void end();
    //方法更进一步允许使用 Hadoop 的配置系统, 重置并重新配置压缩 。
    public void reinit(Configuration conf);

抽象类CompressionOutputStream

主要作用: 定义压缩输出流的接口

CompressorStream

主要作用:持有一个压缩器Compressor,实现了CompressionOutputStream类。提供数据压缩功能。
客户端压缩流程 压缩器内部

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部