《Office 2019高效辦公三合一從入門到精通 : 視頻自學版》 —2.1.3輸入符號
976
2022-05-28
什么是文件壓縮?
一個較大的文件經壓縮后,產生了另一個較小容量的文件。而這個較小容量的文件,我們就叫它是這些較大容量的(可能一個或一個以上的文件)的壓縮文件。而壓縮此文件的過程稱為文件壓縮。
MapReduce 為什么需要文件壓縮?
Hadoop 之所以需要進行文件壓縮,是因為使用文件壓縮可以減少文件存儲所需要的空間,加快數據在網絡和磁盤上的傳輸。處理大文件時,需要仔細考慮在Hadoop中如何使用壓縮,以及使用哪種壓縮。
Hadoop 主要支持哪些壓縮格式?
首先看一下 Hadoop 常見壓縮格式一覽表。
下面我們分析上面幾種壓縮格式的優缺點。
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,而且兼容之前的應用程序(即應用程序不需要修改)的情況。
如何選擇壓縮格式?
Hadoop 應用處理的數據集非常大,因此需要借助于壓縮。使用哪種壓縮格式與待處理的文件的大小、格式和所使用的工具相關。 下面我們給出了一些建議,大致是按照效率從高到低排序的。
1、使用容器文件格式,例如順序文件、RCFile或者 Avro 數據文件,所有這些文件格式同時支持壓縮和切分。通常最好與一個快速壓縮工具聯合使用, 例如 LZO,LZ4,或者 Snappy。
2、使用支持切分的壓縮格式,例如 bzip2(盡管 bzip2 非常慢),或者使用通過索引實現切分的壓縮格式,例如 LZO。
3、在應用中將文件切分成塊,并使用任意一種壓縮格式為每個數據塊建立壓縮文件(不論它是否支持切分)。這種情況下,需要合理選擇數據塊的大小,以確保壓縮后數據塊的大小近似與 HDFS 塊的大小。
4、存儲未經壓縮的文件。
對大文件來說,不要使用不支持切分整個文件的壓縮格式,因為會失去數據的本地特性,進而造成 MapReduce 應用效率低下。
如何在 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 作業中的選項,示例如下所示:
3、map作業輸出結果的壓縮
即使MapReduce應用使用非壓縮的數據來讀取和寫入,我們也可以受益于壓縮map階段的中間輸出。因為map作業的輸出會被寫入磁盤并通過網絡傳輸到reducer節點,所以如果使用 LZO、LZ4或者Snappy之類的快速壓縮方式,能得到更好的性能,因為傳輸的數據量大大減少了。啟用 map 任務輸出壓縮和設置壓縮格式的配置屬性,如下表所示。
下面是在作業中啟用 map 任務輸出 gzip 壓縮格式的代碼(使用新 API)。
Configuration conf = new Configuration();
conf.setBoolean("mapred.compress.map.output",true);
conf.setClass("mapred.map.output.compression.codec",GzipCodec.class,CompressionCodec.class);
在舊的 API 中,JobConf 對象中可通過更便捷的方法實現該功能。
conf.setCompressMapOutput(true);
conf.setMapOutputCompressorClass(GzipCodec.class);
Hadoop MapReduce
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。