Hadoop文件壓縮


1. Hadoop的文件壓縮需求

  文件壓縮對於大容量的分布式存儲系統而言是必須的,它能帶來兩個好處:

  1)減少了文件所需的存儲空間;

  2)加快了文件在網絡上或磁盤間的傳輸速度。

2. Hadoop支持的壓縮格式

  首先看一下 Hadoop 常見壓縮格式,如DEFLATE、Gzip、bzip2、LZO、LZ4、Snappy等。

  1)gzip壓縮

  優點:壓縮率比較高,而且壓縮/解壓速度也比較快;hadoop本身支持,在應用中處理gzip格式的文件就和直接處理文本一樣;hadoop native大部分linux系統都自帶gzip命令,使用方便。
  缺點:不支持split。
  應用場景:當每個文件壓縮之后130M以內的(1個塊大小內),都可以考慮用gzip壓縮格式。譬如說一天或者一個小時的日志壓縮成一個gzip 文件,運行mapreduce程序的時候通過多個gzip文件達到並發。hive程序,streaming程序,和java寫的mapreduce程序完全和文本處理一樣,壓縮之后原來的程序不需要做任何修改。

   2lzo壓縮

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

  缺點:壓縮率比gzip要低一些;hadoop本身不支持,需要安裝;在應用中對lzo格式的文件需要做一些特殊處理(為了支持split需要建索引,還需要指定inputformat為lzo格式)。
  應用場景:一個很大的文本文件,壓縮之后還大於200M以上的可以考慮,而且單個文件越大,lzo優點越越明顯。

  3snappy壓縮

  優點:高速壓縮速度和合理的壓縮率;支持hadoop native
  缺點:不支持split;壓縮率比gzip要低;hadoop本身不支持,需要安裝;linux系統下沒有對應的命令。
  應用場景:當mapreduce作業的map輸出的數據比較大的時候,作為mapreduce的中間數據的壓縮格式;或者作為一個mapreduce作業的輸出和另外一個mapreduce作業的輸入

  4bzip2壓縮

  優點:支持split;具有很高的壓縮率,比gzip壓縮率都高;hadoop本身支持,但不支持native;在linux系統下自帶bzip2命令,使用方便。
  缺點:壓縮/解壓速度慢;不支持native。
  應用場景:適合對速度要求不高,但需要較高的壓縮率的時候,可以作為mapreduce作業的輸出格式;或者輸出之后的數據比較大,處理之后的數據需要壓縮存檔減少磁盤空間並且以后數據用得比較少的情況;或者對單個很大的文本文件想壓縮減少存儲空間,同時又需要支持split,而且兼容之前的應用程序(即應用程序不需要修改)的情況。

3. 如何選擇壓縮格式

  Hadoop 應用處理的數據集非常大,因此需要借助於壓縮。使用哪種壓縮格式與待處理的文件的大小、格式和所使用的工具相關。 下面我們給出了一些建議,大致是按照效率從高到低排序的。

        1)使用容器文件格式,例如順序文件、RCFile或者 Avro 數據文件,所有這些文件格式同時支持壓縮和切分。通常最好與一個快速壓縮工具聯合使用, 例如 LZO,LZ4,或者 Snappy。

        2)使用支持切分的壓縮格式,例如 bzip2(盡管 bzip2 非常慢),或者使用通過索引實現切分的壓縮格式,例如 LZO。

        3)在應用中將文件切分成塊,並使用任意一種壓縮格式為每個數據塊建立壓縮文件(不論它是否支持切分)。這種情況下,需要合理選擇數據塊的大小,以確保壓縮后數據塊的大小近似與 HDFS 塊的大小。

        4)存儲未經壓縮的文件。

        對大文件來說,不要使用不支持切分整個文件的壓縮格式,因為會失去數據的本地特性,進而造成 MapReduce 應用效率低下。

4. 如何在MapReduce中使用壓縮

    1)輸入的文件的壓縮

        如果輸入的文件是壓縮過的,那么在被 MapReduce 讀取時,它們會被自動解壓,根據文件擴展名來決定應該使用哪一個壓縮解碼器。

    2)MapReduce作業的輸出的壓縮

        如果要壓縮 MapReduce 作業的輸出,應在作業配置過程中將 mapred.output.compress 屬性設置為 true 和 mapred.output.compression.codec 屬性設置為自己打算使用的壓縮編碼/解碼器的類名。 另一種方案是在 FileOutputFormat 中使用更便捷的方法設置這些屬性,如下所示。

  FileOutputFormat.setCompressOutput(job, true);//對輸出結果設置壓縮

  FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);//設置壓縮類型

如果為輸出生成順序文件(sequence file),可以設置 mapred.output.compression.type 屬性來控制壓縮格式。默認值是RECORD,即針對每條記錄進行壓縮。如果將其改為 BLOCK,則針對一組記錄進行壓縮,這是推薦的壓縮策略,因為它的壓縮效率更高。 在 SequenceFileOutputFormat 類中還有一個靜態方法 putCompressionType() 可用來便捷地設置該屬性。

        下圖歸納概述了用於設置 MapReduce 作業輸出的壓縮格式的配置屬性。

  如果你的 MapReduce 驅動使用 Tool 接口,則可以通過命令行將這些屬性傳遞給程序,這比通過程序代碼來修改壓縮屬性更加簡便。 比如,要生成 gzip 文件格式的輸出,只需設置streaming 作業中的選項,示例如下所示。

$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \ -input /weather/ \ -output /weather/out/ \ -mapper com.dajiangtai.hadoop.middle.TemperatureMapper \ -reducer com.dajiangtai.hadoop.middle.TemperatureReducer \ -jobconf mapred.output.compress=true \ -jobconf mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCode

     3map作業輸出結果的壓縮

        即使MapReduce應用使用非壓縮的數據來讀取和寫入,我們也可以受益於壓縮map階段的中間輸出。因為map作業的輸出會被寫入磁盤並通過網絡傳輸到reducer節點,所以如果使用 LZO、LZ4或者Snappy之類的快速壓縮方式,能得到更好的性能,因為傳輸的數據量大大減少了。啟用 map 任務輸出壓縮和設置壓縮格式的配置屬性,如下表所示。

  下面是在作業中啟用 map 任務輸出 gzip 壓縮格式的代碼(使用新 API)。

以上就是博主為大家介紹的這一板塊的主要內容,這都是博主自己的學習過程,希望能給大家帶來一定的指導作用,有用的還望大家點個支持,如果對你沒用也望包涵,有錯誤煩請指出。如有期待可關注博主以第一時間獲取更新哦,謝謝! 

 

 版權聲明:本文為博主原創文章,未經博主允許不得轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM