Hadoop數據壓縮
Hadoop數據壓縮
1 概述
壓縮技術能夠有效減少底層存儲系統(HDFS)讀寫字節數。壓縮提高了網絡帶寬和磁盤空間的效率。在Hadood下,尤其是數據規模很大和工作負載密集的情況下,使用數據壓縮顯得非常重要。在這種情況下,I/O操作和網絡數據傳輸要花大量的時間。還有,Shuffle與Merge過程同樣也面臨著巨大的I/O壓力。
鑒于磁盤I/O和網絡帶寬是Hadoop的寶貴資源,數據壓縮對于節省資源、最小化磁盤I/O和網絡傳輸非常有幫助。不過,盡管壓縮與解壓操作的CPU開銷不高,其性能的提升和資源的節省并非沒有代價。
如果磁盤I/O和網絡帶寬影響了MapReduce作業性能,在任意MapReduce階段啟用壓縮都可以改善端到端處理時間并減少I/O和網絡流量。
壓縮mapreduce的一種優化策略:通過壓縮編碼對mapper或者reducer的輸出進行壓縮,以減少磁盤IO,提高MR程序運行速度(但相應增加了cpu運算負擔)。
注意:壓縮特性運用得當能提高性能,但運用不當也可能降低性能。
基本原則:
(1)運算密集型的job,少用壓縮
(2)IO密集型的job,多用壓縮
2 MR支持的壓縮編碼
壓縮格式 | hadoop自帶? | 算法 | 文件擴展名 | 是否可切分 | 換成壓縮格式后,原來的程序是否需要修改 |
DEFAULT | 是,直接使用 | DEFAULT | .deflate | 否 | 和文本處理一樣,不需要修改 |
Gzip | 是,直接使用 | DEFAULT | .gz | 否 | 和文本處理一樣,不需要修改 |
bzip2 | 是,直接使用 | bzip2 | .bz2 | 是 | 和文本處理一樣,不需要修改 |
LZO | 否,需要安裝 | LZO | .lzo | 是 | 需要建索引,還需要指定輸入格式 |
Snappy | 否,需要安裝 | Snappy | .snappy | 否 | 和文本處理一樣,不需要修改 |
為了支持多種壓縮/解壓縮算法,Hadoop引入了編碼/解碼器,如下表所示
壓縮格式 | 對應的編碼/解碼器 |
DEFLATE | org.apache.hadoop.io.compress.DefaultCodec |
gzip | org.apache.hadoop.io.compress.GzipCodec |
bzip2 | org.apache.hadoop.io.compress.BZip2Codec |
LZO | com.hadoop.compression.lzo.LzopCodec |
Snappy | org.apache.hadoop.io.compress.SnappyCodec |
壓縮性能的比較
壓縮算法 | 原始文件大小 | 壓縮文件大小 | 壓縮速度 | 解壓速度 |
gzip | 8.3GB | 1.8GB | 17.5MB/s | 58MB/s |
bzip2 | 8.3GB | 1.1GB | 2.4MB/s | 9.5MB/s |
LZO | 8.3GB | 2.9GB | 49.3MB/s | 74.6MB/s |
http://google.github.io/snappy/
On a single core of a Core i7 processor in 64-bit mode, Snappy compresses at about 250 MB/sec or more and decompresses at about 500 MB/sec or more.
3 各種壓縮方式詳解
3.1 Gzip壓縮
優點:壓縮率比較高,而且壓縮/解壓速度也比較快;hadoop本身支持,在應用中處理gzip格式的文件就和直接處理文本一樣;大部分linux系統都自帶gzip命令,使用方便。
缺點:不支持split。
應用場景:當每個文件壓縮之后在130M以內的(1個塊大小內),都可以考慮用gzip壓縮格式。譬如說一天或者一個小時的日志壓縮成一個gzip文件,運行mapreduce程序的時候通過多個gzip文件達到并發。hive程序,streaming程序,和java寫的mapreduce程序完全和文本處理一樣,壓縮之后原來的程序不需要做任何修改。
3.2 bzip2壓縮
優點:支持split;具有很高的壓縮率,比gzip壓縮率都高;hadoop本身支持,但不支持native;在linux系統下自帶bzip2命令,使用方便。
缺點:壓縮/解壓速度慢;不支持native。
應用場景:適合對速度要求不高,但需要較高的壓縮率的時候,可以作為mapreduce作業的輸出格式;或者輸出之后的數據比較大,處理之后的數據需要壓縮存檔減少磁盤空間并且以后數據用得比較少的情況;或者對單個很大的文本文件想壓縮減少存儲空間,同時又需要支持split,而且兼容之前的應用程序(即應用程序不需要修改)的情況。
3.3 lzo壓縮
優點:壓縮/解壓速度也比較快,合理的壓縮率;支持split,是hadoop中最流行的壓縮格式;可以在linux系統下安裝lzop命令,使用方便。
缺點:壓縮率比gzip要低一些;hadoop本身不支持,需要安裝;在應用中對lzo格式的文件需要做一些特殊處理(為了支持split需要建索引,還需要指定inputformat為lzo格式)。
應用場景:一個很大的文本文件,壓縮之后還大于200M以上的可以考慮,而且單個文件越大,lzo優點越越明顯。
3.4 snappy壓縮
優點:高速壓縮速度和合理的壓縮率。
缺點:不支持split;壓縮率比gzip要低;hadoop本身不支持,需要安裝;
應用場景:當mapreduce作業的map輸出的數據比較大的時候,作為map到reduce的中間數據的壓縮格式;或者作為一個mapreduce作業的輸出和另外一個mapreduce作業的輸入。
3.5 如何選擇壓縮格式?
Hadoop應用處理的數據集非常大,因此需要借助于壓縮。使用哪種壓縮格式與待處理的文件的大小、格式和所使用的工具相關。下面我們給出了一些建議,大致是按照效率從高到低排序的。
1)使用容器文件格式,例如順序文件、RCFile或者Avro 數據文件,所有這些文件格式同時支持壓縮和切分。通常最好與一個快速壓縮工具聯合使用,例如LZO,LZ4或者 Snappy。
2)使用支持切分的壓縮格式,例如bzip2(盡管bzip2 非常慢),或者使用通過索引實現切分的壓縮格式,例如LZO。
3)在應用中將文件切分成塊,并使用任意一種壓縮格式為每個數據塊建立壓縮文件(不論它是否支持切分)。這種情況下,需要合理選擇數據塊的大小,以確保壓縮后數據塊的大小近似與HDFS塊的大小。
4)存儲未經壓縮的文件。
對大文件來說,不要使用不支持切分整個文件的壓縮格式,因為會失去數據的本地特性,進而造成MapReduce應用效率低下。
4 采用壓縮的位置
壓縮可以在MapReduce作用的任意階段啟用。
1)輸入壓縮:
在有大量數據并計劃重復處理的情況下,應該考慮對輸入進行壓縮。然而,你無須顯示指定使用的編解碼方式。Hadoop自動檢查文件擴展名,如果擴展名能夠匹配,就會用恰當的編解碼方式對文件進行壓縮和解壓。否則,Hadoop就不會使用任何編解碼器。
2)壓縮mapper輸出:
當map任務輸出的中間數據量很大時,應考慮在此階段采用壓縮技術。這能顯著改善內部數據Shuffle過程,而Shuffle過程在Hadoop處理過程中是資源消耗最多的環節。如果發現數據量大造成網絡傳輸緩慢,應該考慮使用壓縮技術。可用于壓縮mapper輸出的快速編解碼器包括LZO或者Snappy。
注:LZO是供Hadoop壓縮數據用的通用壓縮編解碼器。其設計目標是達到與硬盤讀取速度相當的壓縮速度,因此速度是優先考慮的因素,而不是壓縮率。與gzip編解碼器相比,它的壓縮速度是gzip的5倍,而解壓速度是gzip的2倍。同一個文件用LZO壓縮后比用gzip壓縮后大50%,但比壓縮前小25%~50%。這對改善性能非常有利,map階段完成時間快4倍。
3)壓縮reducer輸出:
在此階段啟用壓縮技術能夠減少要存儲的數據量,因此降低所需的磁盤空間。當mapreduce作業形成作業鏈條時,因為第二個作業的輸入也已壓縮,所以啟用壓縮同樣有效。
5 壓縮配置參數
要在Hadoop中啟用壓縮,可以配置如下參數(mapred-site.xml文件中):
參數 | 默認值 | 階段 | 建議 |
io.compression.codecs (在core-site.xml中配置) | org.apache.hadoop.io.compress.DefaultCodec, org.apache.hadoop.io.compress.GzipCodec, org.apache.hadoop.io.compress.BZip2Codec, org.apache.hadoop.io.compress.Lz4Codec | 輸入壓縮 | Hadoop使用文件擴展名判斷是否支持某種編解碼器 |
mapreduce.map.output.compress | false | mapper輸出 | 這個參數設為true啟用壓縮 |
mapreduce.map.output.compress.codec | org.apache.hadoop.io.compress.DefaultCodec | mapper輸出 | 使用LZO、LZ4或snappy編解碼器在此階段壓縮數據 |
mapreduce.output.fileoutputformat.compress | false | reducer輸出 | 這個參數設為true啟用壓縮 |
mapreduce.output.fileoutputformat.compress.codec | org.apache.hadoop.io.compress. DefaultCodec | reducer輸出 | 使用標準工具或者編解碼器,如gzip和bzip2 |
mapreduce.output.fileoutputformat.compress.type | RECORD | reducer輸出 | SequenceFile輸出使用的壓縮類型:NONE和BLOCK |