codec其實就是coder和decoder兩個單詞的詞頭組成的縮略詞。 CompressionHTTP://www.aliyun.com/zixun/aggregation/29788.html">Codec定義了壓縮和解壓介面, 我們這裡講的codec就是實現了CompressionCodec介面的一些壓縮格式的類,下面是這些類的清單:
使用CompressionCodes解壓縮CompressionCodec有兩個方法可以方便的壓縮和解壓。 壓縮:通過createOutputStream(OutputStream out)方法獲得CompressionOutputStream物件解壓:通過createInputStream(InputStream in) 方法獲得CompressionInputStream物件壓縮的示例代碼[java] view plaincopy package com.sweetop.styhadoop; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.compress.CompressionCodec; import org.apache.hadoop.io.compress.CompressionOutputStream; import org.apache.hadoop.util.ReflectionUtils ; /** * Created with IntelliJ IDEA. * User: lastsweetop * Date: 13-6-25 * Time: 下午10:09 * To change this template use File | Settings | File Templates. */ 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() ; } } 從命令列接受一個CompressionCodec實現類的參數,然後通過ReflectionUtils把具現化這個類, 調用CompressionCodec的介面方法對標準輸出流進行封裝,封裝成一個壓縮流,通過IOUtils類的copyBytes方法把標準輸入流拷貝到壓縮流中,最後調用CompressionCodec的finish方法, 完成壓縮。 再來看下命令列:[plain] view plaincopy echo "Hello lastsweetop" | ~/hadoop/bin/hadoop com.sweetop.styhadoop.StreamCompressor org.apache.hadoop.io.compress.GzipCodec | gunzip - 使用GzipCodec類來壓縮「Hello lastsweetop」,然後再通過gunzip工具解壓。 我們來看一下輸出:[plain] view plaincopy [exec] 13/06/26 20:01:53 INFO util.820.html"> NativeCodeLoader: Loaded the native-hadoop library [exec] 13/06/26 20:01:53 INFO zlib. ZlibFactory: Successfully loaded & initialized native-zlib library [exec] Hello lastsweetop 使用CompressionCodecFactory解壓縮如果你想讀取一個被壓縮的檔的話, 首先你得先通過副檔名判斷該用哪種codec,可以看下 hadoop深入研究:(七)——壓縮 中得對應關係。 當然有更簡便得辦法,CompressionCodecFactory已經幫你把這件事做了,通過傳入一個Path調用它得getCodec方法,即可獲得相應得codec。 我們來看下代碼[java] view plaincopy package com.sweetop.styhadoop; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path;