Hadoop 作為一個較通用的海量數(shù)據(jù)處理平臺,每次運算都會需要處理大量數(shù)據(jù),我們會在 Hadoop 系統(tǒng)中對數(shù)據(jù)進行壓縮處理來優(yōu)化磁盤使用率,提高數(shù)據(jù)在磁盤和網絡中的傳輸速度,從而提高系統(tǒng)處理數(shù)據(jù)的效率。在使用壓縮方式方面,主要考慮壓縮速度和壓縮文件的可分割性。
綜合所述,使用壓縮的優(yōu)點如下:
- 節(jié)省數(shù)據(jù)占用的磁盤空間;
- 加快數(shù)據(jù)在磁盤和網絡中的傳輸速度,從而提高系統(tǒng)的處理速度。
1、壓縮格式
Hadoop 對于壓縮格式的是自動識別。如果我們壓縮的文件有相應壓縮格式的擴展名(比如 lzo,gz,bzip2 等)。Hadoop 會根據(jù)壓縮格式的擴展名自動選擇相對應的解碼器來解壓數(shù)據(jù),此過程完全是 Hadoop 自動處理,我們只需要確保輸入的壓縮文件有擴展名。
Hadoop 對每個壓縮格式的支持, 詳細見下表:

2、性能對比
Hadoop 下各種壓縮算法的壓縮比,壓縮時間,解壓時間見下表:

因此我們可以得出:
- Bzip2 壓縮效果明顯是最好的,但是 bzip2 壓縮速度慢,可分割。
- Gzip 壓縮效果不如 Bzip2,但是壓縮解壓速度快,不支持分割。
- LZO 壓縮效果不如 Bzip2 和 Gzip,但是壓縮解壓速度最快!并且支持分割!
這里提一下,文件的可分割性在 Hadoop 中是很非常重要的,它會影響到在執(zhí)行作業(yè)時 Map 啟動的個數(shù),從而會影響到作業(yè)的執(zhí)行效率!
所有的壓縮算法都顯示出一種時間空間的權衡,更快的壓縮和解壓速度通常會耗費更多的空間。在選擇使用哪種壓縮格式時,我們應該根據(jù)自身的業(yè)務需求來選擇。
3、壓縮的使用
MapReduce 可以在三個階段中使用壓縮。
1、輸入階段
如果輸入的文件是壓縮過的,那么在被 MapReduce 讀取時,它們會被自動解壓。
2、map輸出中間結果
(1) 在 core-site.xml 文件中配置,代碼如下
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
</property>
(2)使用Java代碼指定
conf.setCompressMapOut(true);
conf.setMapOutputCompressorClass(GzipCode.class);
3、reduce輸出最終結果
(1) 在 core-site.xml 文件中配置,代碼如下
<property>
<name>mapred.output.compress</name>
<value>true</value>
</property>
(2)使用Java代碼指定
conf.setBoolean(“mapred.output.compress”,true);
conf.setClass(“mapred.output.compression.codec”,GzipCode.class,CompressionCodec.class);