Hadoop SequnceFile.Writer 压缩模式及压缩库浅析
2019獨角獸企業重金招聘Python工程師標準>>>
先說明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?appropriatelyif(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?loadif(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?
轉載于:https://my.oschina.net/shipley/blog/498712
總結
以上是生活随笔為你收集整理的Hadoop SequnceFile.Writer 压缩模式及压缩库浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Play 1.x 实现简单云计算多租户
- 下一篇: 解决linux ssh客户端SSH连接l