1. 简介
文件压缩有两大好处:
- 减少存储文件所需要的磁盘空间。
- 并加速数据在网络和磁盘上的传输。
“是否可切分”:表示对应的压缩算法是否支持切分,也就是说说,是否可以搜索数据流的任意位置并一步往下读取数据。
2. codec
codec实现了一种压缩-解压缩的算法。
在Hadoop中,一个对CompressionCodec接口的实现代表一个codec。
LZO代码库连接:http://download.youkuaiyun.com/detail/it_dx/9667245
3. 通过CompressionCodec对数据流进行压缩和解压缩
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionOutputStream;
import org.apache.hadoop.util.ReflectionUtils;
public class StreamCompressor {
public static void main(String[] args) throws Exception{
//将具有压缩的类将参数传入类中,这个类作为CodePressionCodec的具体实现
String codecClassname = args[0];
//对类进行加载
Class<?> codecClass = Class.forName(codecClassname);
Configuration conf = new Configuration();
CompressionCodec codec = (CompressionCodec)ReflectionUtils.newInstance(codecClass,conf);
//对数据流进行压缩输出使用compressionOutputStream,输入使用:CompressionOutputStream
CompressionOutputStream out = codec.createOutputStream(System.out);
//参数详解
/**
* 第一个参数是输入数据流
* 第二个人参数是经过压缩的输出数据流
* 第三个参数是指缓存区的大小
* 第四个参数是设置结束后是否关闭数据流
* */
IOUtils.copyBytes(System.in,out,4096,false);
out.finish();
}
}
执行命令:
- javac StreamCompressor.java
- jar cvf StreamCompressor.jar StreamCompressor.class
- echo “Test” | hadoop jar StreamCompressor.jar StreamCompressor org.apache.hadoop.io.compress.GzipCodec \ | gunzip
注:使用gunzip从标准输入中对他进行读取并解压缩操作。