Hadoop 作為一個較通用的海量數(shù)據(jù)處理平臺,每次運算都會需要處理大量數(shù)據(jù)棚亩,我們會在 Hadoop 系統(tǒng)中對數(shù)據(jù)進行壓縮處理來優(yōu)化磁盤使用率蓖议,提高數(shù)據(jù)在磁盤和網(wǎng)絡(luò)中的傳輸速度,從而提高系統(tǒng)處理數(shù)據(jù)的效率讥蟆。在使用壓縮方式方面勒虾,主要考慮壓縮速度和壓縮文件的可分割性。
綜合所述瘸彤,使用壓縮的優(yōu)點如下:
- 節(jié)省數(shù)據(jù)占用的磁盤空間修然;
- 加快數(shù)據(jù)在磁盤和網(wǎng)絡(luò)中的傳輸速度,從而提高系統(tǒng)的處理速度质况。
1愕宋、壓縮格式
Hadoop 對于壓縮格式的是自動識別。如果我們壓縮的文件有相應(yīng)壓縮格式的擴展名(比如 lzo结榄,gz中贝,bzip2 等)。Hadoop 會根據(jù)壓縮格式的擴展名自動選擇相對應(yīng)的解碼器來解壓數(shù)據(jù)臼朗,此過程完全是 Hadoop 自動處理邻寿,我們只需要確保輸入的壓縮文件有擴展名。
Hadoop 對每個壓縮格式的支持, 詳細見下表:
2视哑、性能對比
Hadoop 下各種壓縮算法的壓縮比绣否,壓縮時間,解壓時間見下表:
因此我們可以得出:
- Bzip2 壓縮效果明顯是最好的挡毅,但是 bzip2 壓縮速度慢蒜撮,可分割。
- Gzip 壓縮效果不如 Bzip2跪呈,但是壓縮解壓速度快淀弹,不支持分割。
- LZO 壓縮效果不如 Bzip2 和 Gzip庆械,但是壓縮解壓速度最快!并且支持分割菌赖!
這里提一下缭乘,文件的可分割性在 Hadoop 中是很非常重要的,它會影響到在執(zhí)行作業(yè)時 Map 啟動的個數(shù)琉用,從而會影響到作業(yè)的執(zhí)行效率堕绩!
所有的壓縮算法都顯示出一種時間空間的權(quán)衡,更快的壓縮和解壓速度通常會耗費更多的空間邑时。在選擇使用哪種壓縮格式時奴紧,我們應(yīng)該根據(jù)自身的業(yè)務(wù)需求來選擇。
3晶丘、壓縮的使用
MapReduce 可以在三個階段中使用壓縮黍氮。
1唐含、輸入階段
如果輸入的文件是壓縮過的,那么在被 MapReduce 讀取時沫浆,它們會被自動解壓捷枯。
2、map輸出中間結(jié)果
(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輸出最終結(jié)果
(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);