codec
codec实现了一种压缩-解压缩算法。在hadoop中,一个对CompressionCodec接口的实现代表一个codec。例如,GzipCodec包装了gzip压缩和解压缩算法
hadoop的压缩codec
压缩格式 | HadoopCompressionCodec |
---|---|
DEFLATE | org.apache.hadoop.io.conpress.DefaultCodec |
gzip | org.apache.hadoop.io.conpress.GzipCodec |
bzip2 | org.apache.hadoop.io.conpress.BZip2Codec |
LZO | com.hadoop.compression.lzo.LzopCodec |
LZ4 | Org.apache.hadoop.io.compress.Lz4Codec |
Snappy | Org.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