標籤:blog http java 使用 檔案 資料
1.1. 壓縮
減少儲存空間,加快傳輸速率
在hadoop中,壓縮應用於檔案儲存體、Map端到Reduce端的資料交換等情景。
hadoop,主要考慮壓縮速率和壓縮檔的可分割性
壓縮演算法:時間和空間的權衡
更快的壓縮和解壓縮效率通常壓縮比較低。
hadoop提供了對壓縮演算法的編碼和解碼器類
編碼和解碼樣本(採用gzip)
package test;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.IOUtils;import org.apache.hadoop.io.compress.CompressionCodec;import org.apache.hadoop.io.compress.CompressionCodecFactory;import org.apache.hadoop.io.compress.CompressionOutputStream;import org.apache.hadoop.util.ReflectionUtils;public class CompressDemo {public static void main(String[] args) throws Exception {//compress("org.apache.hadoop.io.compress.GzipCodec");//GzipCodecdecompress("readme.gz");}public static void compress(String className) throws Exception{File filein = new File("readme.txt");//輸入資料流InputStream in = new FileInputStream(filein);Class codecClass = Class.forName(className);Configuration conf = new Configuration();//編碼器執行個體CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(codecClass, conf);//輸出資料流,若存在,先刪除File fileout = new File("readme"+codec.getDefaultExtension());fileout.delete();OutputStream out = new FileOutputStream(fileout);//編碼器封裝輸出資料流,成為編碼輸出資料流CompressionOutputStream codecOut = codec.createOutputStream(out);//編碼輸出IOUtils.copyBytes(in, codecOut, 1024, true);}public static void decompress(String fileName) throws Exception{Configuration conf = new Configuration();CompressionCodecFactory fact = new CompressionCodecFactory(conf);//得到一個轉碼器CompressionCodec codec = fact.getCodec(new Path(fileName));if(codec == null){System.out.println("Cannot find the codec for file "+fileName);return;}//輸入資料流InputStream in = codec.createInputStream(new FileInputStream(new File(fileName)));//輸出到控制台IOUtils.copyBytes(in, System.out, conf);}}
1.1.1. 壓縮器和解壓縮器
getCompressor()可以得到對應編碼器的壓縮器。
在各個壓縮流中都有實現,但是不建議手工去實現,一是複雜二是效率。
總結:hadoop使用CompressionCodec編碼和解碼器,裡面使用的流是壓縮和解壓縮流CompressionOutputStream和CompressionInputStream,而在流中採用了壓縮和解壓縮器Compressor、Decompressor
通過上面的那個樣本,可以使用即可。
1.1.2. java本地方法
資料壓縮往往是極速密集型的操作,考慮到效能,建議使用本地庫(Native Library)來壓縮和解壓。(在某個測試中,與java內建的gzip壓縮相比,使用本地gzip壓縮庫可將解壓時間減少50%,壓縮時間減少10%)。
這個可以在真正使用到的時候再研究,因為設定C語言等其它語言。
1.1.3. snappy壓縮
資料壓縮庫,被google用於許多內部項目,如BigTable,Mapreduce,等該演算法庫針對效能做了調整,經過了PB級資料壓縮的考驗,所以有必要提一提。
org.apache.hadoop.io.compress.snappy包
SnappyCodec類
方法:
setInput為壓縮器提供資料
needsInput是否需要載入新的輸入資料
compress 壓縮資料
finished 壓縮是否結束
在需要的時候可以研究一下。