Hadoop SequnceFile.Writer压缩模式及压缩库举例分析

40次阅读
没有评论

这篇文章主要讲解了“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 小编将为大家推送更多相关知识点的文章,欢迎关注!