这篇文章主要讲解了“Hadoop SequnceFile.Writer 压缩模式及压缩库举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“Hadoop SequnceFile.Writer 压缩模式及压缩库举例分析”吧!
先说明 SequnceFile 的压缩类型(Compression Type)分为三种 NONE,RECORD,BLOCK,通过配置项 io.seqfile.compression.type 指定:
NONE, Do not compress records 即不压缩
RECORD, Compress values only, each separately. 每条记录都对 value 进行一次压缩
BLOCK, Compress sequences of records together in blocks. 块压缩,当缓存的 key 和 value 字节大小达到指定的阈值,则进行压缩,阈值由配置项 io.seqfile.compress.blocksize 指定,默认值为 1000000 字节
RECORD,BLOCK 使用的压缩算法是由创建 SequnceFile.Writer 时指定的 CompressionOption 决定的, CompressionOption 中 CompressionCodec codec 属性即为压缩编码器, 不指定时默认为 org.apache.hadoop.io.compress.DefaultCodec 对应的底层压缩库为 zlib,除了 DefaultCodec 还有几个其他的 CompressionCodec:GzipCodec Lz4Codec SnappyCodec BZip2Codec 这里不做比较
DefaultCodec 在实现 zlib 压缩的时候,可以指定使用 libhadoop.so(hadoop 框架提供的 native 库)或 java.util.zip 库。下面了解下如何开启 hadoop native 库或 java zip 库:
SequnceFile 默认使用的是 org.apache.hadoop.io.compress.DefaultCodec 压缩方式,使用的是 Deflate 的压缩算法
DefaultCodec 在创建压缩器时会执行类 ZlibFactory.getZlibCompressor(conf) 方法,实现代码片段:
return (isNativeZlibLoaded(conf)) ?
new ZlibCompressor(conf) :
new BuiltInZlibDeflater(ZlibFactory.getCompressionLevel(conf).compressionLevel());
当加载本地 Zlib 库时,使用的是 ZlibCompressor 压缩器类,否则使用 BuiltInZlibDeflater 类,BuiltInZlibDeflater 类是调用 java 的 java.util.zip.Inflater 类实现;
其中 isNativeZlibLoaded 是根据 NativeCodeLoader 类是否已经加载 hadoop native 库来判断的,代码如下:
// Try to load native hadoop library and set fallback flag appropriately
if(LOG.isDebugEnabled()) {
LOG.debug( Trying to load the custom-built native-hadoop library...
}
try {
System.loadLibrary( hadoop
LOG.debug( Loaded the native-hadoop library
nativeCodeLoaded = true;
} catch (Throwable t) {
// Ignore failure to load
if(LOG.isDebugEnabled()) { LOG.debug( Failed to load native-hadoop with error: + t);
LOG.debug( java.library.path= +
System.getProperty(java.library.path));
}
}
if (!nativeCodeLoaded) {
LOG.warn( Unable to load native-hadoop library for your platform... +
using builtin-java classes where applicable
}
其中 System.loadLibrary(hadoop 在 linux 上查找的就是 libhadoop.so。
总结:当无法加载本地的 hadoop 库,hadoop 会使用 java.util.zip.Inflater 类来对 SequnceFile 进行压缩;当可以加载到本地 hadoop 库,则使用本地的库。
下面来比较实用 native hadoop 库和不使用 native hadoop 的性能区别。
不使用 native hadoop 即在 jvm 运行参数 java.library.path 中不包含 native 库的路径:
java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
使用则在后面加上 hadoop 的 native 库路径:
java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib:$HADOOP_HOME/lib/native
虚拟机集群:
50w 数据,sequnceFile 压缩模式为 RECORD, key 为随机的 10 字节,value 为随机 200 字节:
native lib disabled: 32689ms after compression 114.07 MB
native lib enabled: 30625ms after compression 114.07 MB
50w 数据,sequnceFile 压缩模式为 BLOCK, key 为随机的 10 字节,value 为随机 200 字节:
native lib disabled: 11354ms after compression 101.17 MB
native lib enabled: 10699ms after compression 101.17 MB
物理机集群:
50w 数据,sequnceFile 压缩模式为 RECORD, key 为随机的 10 字节,value 为随机 200 字节:
native lib disabled: 21953ms after compression 114.07 MB
native lib enabled: 24742ms after compression 114.07 MB
100w 数据,sequnceFile 压缩模式为 RECORD, key 为随机的 10 字节,value 为随机 200 字节:
native lib disabled: 48555ms after compression 228.14 MB
native lib enabled: 45770ms after compression 228.14 MB
100w 数据,sequnceFile 压缩模式为 RECORD, key 为随机的 10 字节,value 为随机 200 字节, 设置 zlib 压缩级别为 BEST_SPEED:
native lib disabled: 44872ms after compression 228.14 MB
native lib enabled: 51582ms after compression 228.14 MB
100w 数据,sequnceFile 压缩模式为 BLOCK, key 为随机的 10 字节,value 为随机 200 字节, 设置 zlib 压缩级别为 BEST_SPEED:
native lib disabled: 14374ms after compression 203.54 MB
native lib enabled: 14639ms after compression 203.54 MB
100w 数据,sequnceFile 压缩模式为 BLOCK, key 为随机的 10 字节,value 为随机 200 字节, 设置 zlib 压缩级别为 DEFAULT_COMPRESSION:
native lib disabled: 15397ms after compression 203.54 MB
native lib enabled: 13669ms after compression 203.54 MB
分析测试结果,总结如下:
当在不同的压缩模式,或不同的数据量,以及不同的 zlib 压缩级别时,使用 hadoop native 库压缩和使用 java zip 库之间没有太大差别
后续再尝试其他的 native 压缩编码方式:GzipCodec Lz4Codec SnappyCodec BZip2Codec
感谢各位的阅读,以上就是“Hadoop SequnceFile.Writer 压缩模式及压缩库举例分析”的内容了,经过本文的学习后,相信大家对 Hadoop SequnceFile.Writer 压缩模式及压缩库举例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!