hadoop的I/O操作——压缩实现

codec

codec实现了一种压缩-解压缩算法。在hadoop中,一个对CompressionCodec接口的实现代表一个codec。例如,GzipCodec包装了gzip压缩和解压缩算法
hadoop的压缩codec

压缩格式HadoopCompressionCodec
DEFLATEorg.apache.hadoop.io.conpress.DefaultCodec
gziporg.apache.hadoop.io.conpress.GzipCodec
bzip2org.apache.hadoop.io.conpress.BZip2Codec
LZOcom.hadoop.compression.lzo.LzopCodec
LZ4Org.apache.hadoop.io.compress.Lz4Codec
SnappyOrg.apache.hadoop.io.compress.SnappyCodec

LZO代码可能不在apache发行版中,因此,需要单独从http://code.google.com/p/hadoop-gpl-compressing下载,或从http://github.com/kevinweil/hadoop-lzo下载

1、通过CompressionCodec对数据流进行压缩和解压缩

CompressionCodec包含两个函数,可以轻松用于压缩和解压缩数据。如果要对写入输出数据流的数据进行压缩,可用createOutputSream(OutputStream out)方法在底层的数据流中对需要以压缩格式写入在此之前尚未压缩的数据新建一个CompressionOutputSream对象。相反,对输入数据流中读取的数据进行解压缩的时候,测调用createInputSream(InputStream in)获取CompressionInputSream,可通过该方法从底层数据流读取解压缩后的数据。
CompressionOutputStream和CompressionInputStream,类似于java.util.zip.DeflaterOutputStream和java.util.zip.DeflaterInputStream,只不过前两者能够重置其底层的压缩和解压缩方法,对于某些将部分数据流(section of data stream)压缩为单独数据块(block)的应用——例如Sequencefile,这个能力是非常重要的。
下面显示了如何用API来压缩从标准输入中读取的数据并将其写到标准输出。

public class StreamCompressor{
	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(codec, conf);
		CompressionOutputStream out = codec.createOutputStream(System.out);
		IOUtils.copyBytes(System.in, out, 4096, false);
		out.finish();
	}
}

该应用希望将符合CompressionCodec实现的完全合格名称作为第一个命令行参数。我们使用ReflectionUtils新建一个codec实例,并由此获得在System.out上支持压缩的一个包裹方法。然后对IOUtils对象调用copyBytes()方法将输入数据复制到输出,(输出由CompressionOutputStream对象压缩)。最后,我们对CompressionOutputStream对象调用finish()方法,要求压缩方法完成到压缩数据流的写操作,但不关闭这个数据流。我们可以用下面这行命令做一个测试,通过GzipCodec的StreamCompressor对象对字符串Text进行压缩,然后使用gunzip从标准输入中对它进行读取并解压缩操作:

% echo "Text" | hadoop StreamCompressor org.apache.hadoop.io.compress.GzipCodec \ | gunzip
Text
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值