Hadoop技術內幕HDFS-筆記4之壓縮

來源:互聯網
上載者:User

標籤: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 壓縮是否結束

         在需要的時候可以研究一下。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.