[hadoop源码阅读][4]-org.apache.hadoop.io.compress系列1-认识解码器/编码器
来源:互联网 发布:ipadmini安装不了软件 编辑:程序博客网 时间:2024/06/08 06:18
转自:http://www.cnblogs.com/xuxm2007/archive/2012/06/15/2550996.html
编码器和解码器用以执行压缩解压算法。在Hadoop里,编码/解码器是通过一个压缩解码器接口实现的。因此,例如,GzipCodec封装了gzip压缩的压缩和解压算法。下表列出了Hadoop可用的编码/解码器。
压缩格式 Hadoop压缩编码/解码器DEFLATEorg.apache.hadoop.io.compress.DefaultCodecgziporg.apache.hadoop.io.compress.GzipCodecbzip2org.apache.hadoop.io.compress.BZip2CodecLZOcom.hadoop.compression.lzo.LzopCodecLZO格式是基于GPL许可的,不能通过Apache来分发许可,基于此,它的hadoop}编码/解码器必须单独下载,地址是http: //code.google.com/p/hadoop-gpl-compression/。lzop编码/解码器兼容干lzop工具,它其实就是LZO 格式,但额外还有头部,它正是我们想要的。还有一个纯LZO格式的编码/解码器LzoCodec,它使用.lzo_deflate作为扩展名(根据 DEFLATE类推,是没有头部的gzip格式)。
下例中说明了如何使用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(codecClass, conf); CompressionOutputStream out = codec.createOutputStream(System.out); IOUtils.copyBytes(System.in, out, 4096, false); out.finish(); }}
%
echo
"Text"
| hadoop StreamCompressor org.apache.hadoop.io.compress.GzipCodec
| gunzip -Text
在阅读一个压缩文件时,我们通常可以从其扩展名来推断出它的编码/解码器。以.gz结尾的文件可以用GzipCodec来阅读,如此类推。每个压缩格式的扩展名均以下表所示:
压缩格式 工具 算法 文件扩展名 多文件 可分割性DEFLATEa无DEFLATE.deflate不不gzipgzipDEFLATE.gz不不ZIPzipDEFLATE.zip是是,在文件范围内bzip2bzip2bzip2.bz2不是LZOlzopLZO.lzo不是
CompressionCodecFactory提供了getCodec()方法,从而将文件扩展名映射到相应的CompressionCodec。此方法接受一个Path对象。下面的例子显示了一个应用程序,此程序便使用这个功能来解压缩文件。
public class FileDecompressor { public static void main(String[] args) throws Exception { String uri = args[0]; Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(uri), conf); Path inputPath = new Path(uri); CompressionCodecFactory factory = new CompressionCodecFactory(conf); CompressionCodec codec = factory.getCodec(inputPath); if (codec == null) { System.err.println("No codec found for " + uri); System.exit(1); } String outputUri = CompressionCodecFactory.removeSuffix(uri, codec.getDefaultExtension()); InputStream in = null; OutputStream out = null; try { in = codec.createInputStream(fs.open(inputPath)); out = fs.create(new Path(outputUri)); IOUtils.copyBytes(in, out, conf); } finally { IOUtils.closeStream(in); IOUtils.closeStream(out); } }}
% hadoop FileDecompressor
file
.gz
属性名 类型 默认值 描述io.compression.codecs逗号分隔的类名org.apache.hadoop.io.
compress.DefaultCodec,
org.apache.hadoop.io.
compress.GzipCodec,
org.apache.hadoop.io.
compress.Bzip2Codec用于压缩/解压的CompressionCodec列表
表4-3
考虑到性能,最好使用一个本地库(native library)来压缩和解压。例如,在一个测试中,使用本地gzip压缩库减少了解压时间50%,压缩时间大约减少了10%(与内置的Java实现相比 较)。表4-4展示了Java和本地提供的每个压缩格式的实现。井不是所有的格式都有本地实现(例如bzip2压缩),而另一些则仅有本地实现(例如 LZO)。
压缩格式Java实现本地实现DEFLATE是是gzip是是bzip2是否LZO否是
Hadoop带有预置的32位和64位Linux的本地压缩库,位于库/本地目录。对于其他平台,需要自己编译库,具体请参见Hadoop的维基百科http://wiki.apache.org/hadoop/NativeHadoop。
本地库通过Java系统属性java.library.path来使用。Hadoop的脚本在bin目录中已经设置好这个属性,但如果不使用该脚本,则需要在应用中设置属性。
默认情况下,Hadoop会在它运行的平台上查找本地库,如果发现就自动加载。这意味着不必更改任何配置设置就可以使用本地库。在某些情况下,可能 希望禁用本地库,比如在调试压缩相关问题的时候。为此,将属性hadoop.native.lib设置为false,即可确保内置的Java等同内置实现 被使用(如果它们可用的话)。
CodecPool(压缩解码池)
如果要用本地库在应用中大量执行压缩解压任务,可以考虑使用CodecPool,从而重用压缩程序和解压缩程序,节约创建这些对象的开销。
下例所用的API只创建了一个很简单的压缩程序,因此不必使用这个池。此应用程序使用一个压缩池程序来压缩从标准输入读入然后将其写入标准愉出的数据:
public class PooledStreamCompressor { 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(codecClass, conf); Compressor compressor = null; try { compressor = CodecPool.getCompressor(codec); CompressionOutputStream out = codec.createOutputStream(System.out, compressor); IOUtils.copyBytes(System.in, out, 4096, false); out.finish(); } finally { CodecPool.returnCompressor(compressor); } }}
http://www.itivy.com/arch/archive/2011/12/10/hadoop-codec-usage.html
- [hadoop源码阅读][4]-org.apache.hadoop.io.compress系列1-认识解码器/编码器
- org.apache.hadoop.io.compress系列1-认识解码器/编码器
- 认识org.apache.hadoop.io.compress解码器/编码器
- [hadoop源码阅读][4]-org.apache.hadoop.io.compress系列2-选择编解码器
- [hadoop源码阅读][4]-org.apache.hadoop.io.compress系列3-使用压缩
- org.apache.hadoop.io.compress源码解读
- [hadoop源码阅读][4]-org.apache.hadoop.io
- Class org.apache.hadoop.io.compress.BZip2Codec not found
- org.apache.hadoop.io
- hadoop io 源码阅读
- 通过hadoop实现单词的统计,并将统计结果保存到Hbase以及错误排解:org.apache.hadoop.io.compress.SnappyCodec not found
- hadoop源码分析系列之(一)——org.apache.hadoop.conf包
- hadoop源码分析系列(二)——org.apache.hadoop.fs包 ----(上)
- hadoop源码分析系列(三)——org.apache.hadoop.fs包 ----(下)
- hadoop源码分析系列(四)——org.apache.hadoop.hdfs包之协议篇
- hadoop源码分析系列(五)——org.apache.hadoop.hdfs包之balancer篇
- hadoop源码分析系列(六)——org.apache.hadoop.hdfs包之nameNode篇
- hadoop源码分析系列之(一)——org.apache.hadoop.conf包
- 浏览器缓存机制
- JVM调优总结 -Xms -Xmx -Xmn -Xss
- dgesvd函数
- 需要考的证书
- ibatis源码学习3_参数和结果的映射原理
- [hadoop源码阅读][4]-org.apache.hadoop.io.compress系列1-认识解码器/编码器
- COM编程入门:第一部分 什么是COM,如何使用COM
- 2012我国粮食产量再增长
- Java多线程编程环境中单例模式的实现
- Linux驱动程序学习笔记(7)—— 阻塞、POLL
- 在对话框中使用CSrollView
- COM编程入门:第二部分 深入COM服务器
- C++成员函数指针的使用方法
- [wtl学习]-[第三天]-THUNK技术学习