Hadoop技术内幕HDFS-笔记4之压缩
2014-06-30 22:57
417 查看
1.1. 压缩
减少存储空间,加快传输速率在hadoop中,压缩应用于文件存储、Map端到Reduce端的数据交换等情景。
hadoop,主要考虑压缩速率和压缩文件的可分割性
压缩算法:时间和空间的权衡
更快的压缩和解压缩效率通常压缩比较低。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/13/b24b85e4b7924fb36aa7ebbbe725f933.jpg)
hadoop提供了对压缩算法的编码和解码器类
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/13/79e0d2a0e6c7115d8a0f25a7845d5fff.jpg)
编码和解码示例(采用gzip)
package test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.compress.CompressionCodec; import org.apache.hadoop.io.compress.CompressionCodecFactory; import org.apache.hadoop.io.compress.CompressionOutputStream; import org.apache.hadoop.util.ReflectionUtils; public class CompressDemo { public static void main(String[] args) throws Exception { //compress("org.apache.hadoop.io.compress.GzipCodec"); //GzipCodec decompress("readme.gz"); } public static void compress(String className) throws Exception{ File filein = new File("readme.txt"); //输入流 InputStream in = new FileInputStream(filein); Class codecClass = Class.forName(className); Configuration conf = new Configuration(); //编码器实例 CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(codecClass, conf); //输出流,若存在,先删除 File fileout = new File("readme"+codec.getDefaultExtension()); fileout.delete(); OutputStream out = new FileOutputStream(fileout); //编码器包装输出流,成为编码输出流 CompressionOutputStream codecOut = codec.createOutputStream(out); //编码输出 IOUtils.copyBytes(in, codecOut, 1024, true); } public static void decompress(String fileName) throws Exception{ Configuration conf = new Configuration(); CompressionCodecFactory fact = new CompressionCodecFactory(conf); //得到一个编解码器 CompressionCodec codec = fact.getCodec(new Path(fileName)); if(codec == null){ System.out.println("Cannot find the codec for file "+fileName); return; } //输入流 InputStream in = codec.createInputStream(new FileInputStream(new File(fileName))); //输出到控制台 IOUtils.copyBytes(in, System.out, conf); } }
1.1.1. 压缩器和解压缩器
getCompressor()可以得到对应编码器的压缩器。在各个压缩流中都有实现,但是不建议手工去实现,一是复杂二是效率。
总结:hadoop使用CompressionCodec编码和解码器,里面使用的流是压缩和解压缩流CompressionOutputStream和CompressionInputStream,而在流中采用了压缩和解压缩器Compressor、Decompressor
通过上面的那个示例,可以使用即可。
1.1.2. java本地方法
数据压缩往往是极速密集型的操作,考虑到性能,建议使用本地库(Native Library)来压缩和解压。(在某个测试中,与java内置的gzip压缩相比,使用本地gzip压缩库可将解压时间减少50%,压缩时间减少10%)。![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/13/1cb954e03b3ddfed865282749d434e1e.jpg)
这个可以在真正使用到的时候再研究,因为设置C语言等其它语言。
1.1.3. snappy压缩
数据压缩库,被google用于许多内部项目,如BigTable,Mapreduce,等该算法库针对性能做了调整,经过了PB级数据压缩的考验,所以有必要提一提。org.apache.hadoop.io.compress.snappy包
SnappyCodec类
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/13/9121db8fb2002a8585599cbe489d5444.jpg)
方法:
setInput为压缩器提供数据
needsInput是否需要加载新的输入数据
compress 压缩数据
finished 压缩是否结束
在需要的时候可以研究一下。
相关文章推荐
- Hadoop技术内幕HDFS-笔记1
- Hadoop技术内幕HDFS-笔记6之RPC
- Hadoop技术内幕HDFS-笔记2
- Hadoop技术内幕HDFS-笔记4之远程调用
- Hadoop技术内幕HDFS-笔记3之序列化
- Hadoop技术内幕HDFS-笔记5之动态代理
- 2本Hadoop技术内幕电子书百度网盘下载:深入理解MapReduce架构设计与实现原理、深入解析Hadoop Common和HDFS架构设计与实现原理
- Hadoop技术内幕-序列化与压缩
- hadoop技术内幕-序列化与压缩(一)
- hadoop技术内幕-序列化与压缩(一)
- hadoop技术内幕-序列化与压缩(一)
- VC++技术内幕(第四版)笔记(第14章)
- C#技术内幕 学习笔记
- VC++技术内幕(第四版)笔记--SetWindowExt和SetViewportExt
- VC++技术内幕(第四版)笔记(第3章)
- VC++技术内幕(第四版)笔记(1~2章)
- VC++技术内幕(第四版)笔记(第7章)
- VC++技术内幕(第四版)笔记(第17章)
- VC++技术内幕(第四版)笔记(第16章)
- VC++技术内幕(第四版)笔记(第5章)