1. 程式人生 > >hadoop的檔案壓縮

hadoop的檔案壓縮

目前在Hadoop中用得比較多的有lzo,gzip,snappy,bzip2這4種壓縮格式,筆者根據實踐經驗介紹一下這4種壓縮格式的優缺點和應用場景,以便大家在實踐中根據實際情況選擇不同的壓縮格式。1 gzip壓縮

優點:壓縮率比較高,而且壓縮/解壓速度也比較快;hadoop本身支援,在應用中處理gzip格式的檔案就和直接處理文字一樣;有hadoop native庫;大部分linux系統都自帶gzip命令,使用方便。

缺點:不支援split。

應用場景:當每個檔案壓縮之後在130M以內的(1個塊大小內),都可以考慮用gzip壓縮格式。譬如說一天或者一個小時的日誌壓縮成一個gzip檔案,執行mapreduce程式的時候通過多個gzip檔案達到併發。hive程式,streaming程式,和java寫的mapreduce程式完全和文字處理一樣,壓縮之後原來的程式不需要做任何修改。

2 lzo壓縮

優點:壓縮/解壓速度也比較快,合理的壓縮率;支援split,是hadoop中最流行的壓縮格式;支援hadoop native庫;可以在linux系統下安裝lzop命令,使用方便。

缺點:壓縮率比gzip要低一些;hadoop本身不支援,需要安裝;在應用中對lzo格式的檔案需要做一些特殊處理(為了支援split需要建索引,還需要指定inputformat為lzo格式)。

應用場景:一個很大的文字檔案,壓縮之後還大於200M以上的可以考慮,而且單個檔案越大,lzo優點越越明顯。

3 snappy壓縮

優點:高速壓縮速度和合理的壓縮率;支援hadoop native庫。

缺點:不支援split;壓縮率比gzip要低;hadoop本身不支援,需要安裝;linux系統下沒有對應的命令。

應用場景:當mapreduce作業的map輸出的資料比較大的時候,作為map到reduce的中間資料的壓縮格式;或者作為一個mapreduce作業的輸出和另外一個mapreduce作業的輸入。

4 bzip2壓縮

優點:支援split;具有很高的壓縮率,比gzip壓縮率都高;hadoop本身支援,但不支援native;在linux系統下自帶bzip2命令,使用方便。

缺點:壓縮/解壓速度慢;不支援native。

應用場景:適合對速度要求不高,但需要較高的壓縮率的時候,可以作為mapreduce作業的輸出格式;或者輸出之後的資料比較大,處理之後的資料需要壓縮存檔減少磁碟空間並且以後資料用得比較少的情況;或者對單個很大的文字檔案想壓縮減少儲存空間,同時又需要支援split,而且相容之前的應用程式(即應用程式不需要修改)的情況。

最後用一個表格比較上述4種壓縮格式的特徵(優缺點):

如何在MapReduce中使用壓縮

1,輸入檔案

如果讀取的是輸入檔案,會根據字尾判斷使用哪種壓縮解碼器自動解壓

2,MapReduce的輸出檔案

FileOutputFormat.setCompressOutput(job, true);//對輸出結果設定壓縮
FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);//設定壓縮型別

3,map輸出結果的壓縮

Configuration conf = new Configuration();
conf.setBoolean("mapred.compress.map.output",true);
conf.setClass("mapred.map.output.compression.codec",GzipCodec.class,CompressionCodec.class);