HADOOP與HDFS數(shù)據(jù)壓縮格式
1、cloudera 數(shù)據(jù)壓縮的一般準則
一般準則
- 是否壓縮數(shù)據(jù)以及使用何種壓縮格式對性能具有重要的影響。在數(shù)據(jù)壓縮上,需要考慮的最重要的兩個方面是 MapReduce 作業(yè)和存儲在 HBase 中的數(shù)據(jù)。在大多數(shù)情況下,每個的原則都類似。
- 您需要平衡壓縮和解壓縮數(shù)據(jù)所需的能力、讀寫數(shù)據(jù)所需的磁盤 IO,以及在網(wǎng)絡(luò)中發(fā)送數(shù)據(jù)所需的網(wǎng)絡(luò)帶寬。正確平衡這些因素有賴于集群和數(shù)據(jù)的特征,以及您的
- 使用模式。
- 如果數(shù)據(jù)已壓縮(例如 JPEG 格式的圖像),則不建議進行壓縮。事實上,結(jié)果文件實際上可能大于原文件。
- GZIP 壓縮使用的 CPU 資源比 Snappy 或 LZO 更多,但可提供更高的壓縮比。GZIP 通常是不常訪問的冷數(shù)據(jù)的不錯選擇。而 Snappy 或 LZO 則更加適合經(jīng)常訪問的熱數(shù)據(jù)。
- BZip2 還可以為某些文件類型生成比 GZip 更多的壓縮,但是壓縮和解壓縮時會在一定程度上影響速度。HBase 不支持 BZip2 壓縮。
- Snappy 的表現(xiàn)通常比 LZO 好。應(yīng)該運行測試以查看您是否檢測到明顯區(qū)別。
- 對于 MapReduce,如果您需要已壓縮數(shù)據(jù)可拆分,BZip2、LZO 和 Snappy 格式都可拆分,但是 GZip 不可以??刹鸱中耘c HBase 數(shù)據(jù)無關(guān)。
- 對于 MapReduce,您可壓縮中間數(shù)據(jù)、輸出或二者。相應(yīng)地調(diào)整您為 MapReduce 作業(yè)提供的參數(shù)。以下示例壓縮中間數(shù)據(jù)和輸出。MR2 先顯示,然后顯示 MR1。
MR2
hadoop jar hadoop-examples-.jar sort "-Dmapreduce.compress.map.output=true"
"-Dmapreduce.map.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec"
"-Dmapreduce.output.compress=true"
"-Dmapreduce.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec" -outKey
org.apache.hadoop.io.Text -outValue org.apache.hadoop.io.Text input output
MR1
hadoop jar hadoop-examples-.jar sort "-Dmapred.compress.map.output=true"
"-Dmapred.map.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec"
"-Dmapred.output.compress=true"
"-Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec" -outKey
org.apache.hadoop.io.Text -outValue org.apache.hadoop.io.Text input output
2、Hadoop 壓縮實現(xiàn)分析
壓縮簡介
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)的處理速度。
壓縮格式
- Hadoop 對于壓縮格式的是自動識別。如果我們壓縮的文件有相應(yīng)壓縮格式的擴展名(比如 lzo,gz,bzip2 等)。
- Hadoop 會根據(jù)壓縮格式的擴展名自動選擇相對應(yīng)的解碼器來解壓數(shù)據(jù),此過程完全是 Hadoop 自動處理,我們只需要確保輸入的壓縮文件有擴展名。
- Hadoop 對每個壓縮格式的支持, 詳細見下表:
| 壓縮格式 | 工具 | 算法 | 擴展名 | 多文件 | 可分割性 |
|---|---|---|---|---|---|
| DEFLATE | 無 | DEFLATE | .deflate | 不 | 不 |
| GZIP | gzip | DEFLATE | .gzp | 不 | 不 |
| ZIP | zip | DEFLATE | .zip | 是 | 是,在文件范圍內(nèi) |
| BZIP2 | bzip2 | BZIP2 | .bz2 | 不 | 是 |
| LZO | lzop | LZO | .lzo | 不 | 是 |
- 如果壓縮的文件沒有擴展名,則需要在執(zhí)行 MapReduce 任務(wù)的時候指定輸入格式。
hadoop jar /usr/home/hadoop/hadoop-0.20.2/contrib/streaming/
hadoop-streaming-0.20.2-CD H3B4.jar -file /usr/home/hadoop/hello/mapper.py -mapper /
usr/home/hadoop/hello/mapper.py -file /usr/home/hadoop/hello/
reducer.py -reducer /usr/home/hadoop/hello/reducer.py -input lzotest -output result4 -
jobconf mapred.reduce.tasks=1*-inputformatorg.apache.hadoop.mapred.LzoTextInputFormat*
性能對比
- Hadoop 下各種壓縮算法的壓縮比,壓縮時間,解壓時間見下表:
| 壓縮算法 | 原始文件大小 | 壓縮文件大小 | 壓縮速度 | 解壓速度 |
|---|---|---|---|---|
| gzip | 8.3GB | 1.8GB | 17.5MB/s | 58MB/s |
| bzip2 | 8.3GB | 1.1GB | 2.4MB/s | 9.5MB/s |
| LZO-bset | 8.3GB | 2GB | 4MB/s | 60.6MB/s |
| LZO | 8.3GB | 2.9GB | 49.3MB/s | 74.6MB/s |
因此我們可以得出:
- Bzip2 壓縮效果明顯是最好的,但是 bzip2 壓縮速度慢,可分割。
- Gzip 壓縮效果不如 Bzip2,但是壓縮解壓速度快,不支持分割。
- LZO 壓縮效果不如 Bzip2 和 Gzip,但是壓縮解壓速度最快!并且支持分割!
這里提一下,文件的可分割性在 Hadoop 中是很非常重要的,它會影響到在執(zhí)行作業(yè)時 Map 啟動的個數(shù),從而會影響到作業(yè)的執(zhí)行效率!
所有的壓縮算法都顯示出一種時間空間的權(quán)衡,更快的壓縮和解壓速度通常會耗費更多的空間。在選擇使用哪種壓縮格式時,我們應(yīng)該根據(jù)自身的業(yè)務(wù)需求來選擇。
3、4種常用壓縮格式在Hadoop中的應(yīng)用
目前在Hadoop中用得比較多的有l(wèi)zo,gzip,snappy,bzip2這4種壓縮格式,筆者根據(jù)實踐經(jīng)驗介紹一下這4種壓縮格式的優(yōu)缺點和應(yīng)用場景,以便大家在實踐中根據(jù)實際情況選擇不同的壓縮格式。
1.gzip壓縮
- 優(yōu)點:
- 壓縮率比較高,而且壓縮/解壓速度也比較快;
- hadoop本身支持,在應(yīng)用中處理gzip格式的文件就和直接處理文本一樣;
- 有hadoop native庫;
- 大部分linux系統(tǒng)都自帶gzip命令,使用方便。
- 缺點:不支持split。
- 應(yīng)用場景:
- 當每個文件壓縮之后在130M以內(nèi)的(1個塊大小內(nèi)),都可以考慮用gzip壓縮格式。譬如說一天或者一個小時的日志壓縮成一個gzip文件,運行mapreduce程序的時候通過多個gzip文件達到并發(fā)。
- hive程序,streaming程序,和java寫的mapreduce程序完全和文本處理一樣,壓縮之后原來的程序不需要做任何修改。
2.lzo壓縮
- 優(yōu)點:
- 壓縮/解壓速度也比較快,合理的壓縮率;
- 支持split,是hadoop中最流行的壓縮格式;
- 支持hadoop native庫;
- 可以在linux系統(tǒng)下安裝lzop命令,使用方便。
- 缺點:
- 壓縮率比gzip要低一些;
- hadoop本身不支持,需要安裝;
- 在應(yīng)用中對lzo格式的文件需要做一些特殊處理(為了支持split需要建索引,還需要指定inputformat為lzo格式)。
- 應(yīng)用場景:
一個很大的文本文件,壓縮之后還大于200M以上的可以考慮,而且單個文件越大,lzo優(yōu)點越明顯。
3.snappy壓縮
- 優(yōu)點:
- 高速壓縮速度和合理的壓縮率;
- 支持hadoop native庫。
- 缺點:
- 不支持split;
- 壓縮率比gzip要低;
- hadoop本身不支持,需要安裝;
- linux系統(tǒng)下沒有對應(yīng)的命令。
- 應(yīng)用場景:
- 當mapreduce作業(yè)的map輸出的數(shù)據(jù)比較大的時候,作為map到reduce的中間數(shù)據(jù)的壓縮格式;
- 或者作為一個mapreduce作業(yè)的輸出和另外一個mapreduce作業(yè)的輸入。
4.bzip2壓縮
- 優(yōu)點:
- 支持split;
- 具有很高的壓縮率,比gzip壓縮率都高;
- hadoop本身支持,但不支持native;
- 在linux系統(tǒng)下自帶bzip2命令,使用方便。
- 缺點:
- 壓縮/解壓速度慢;
- 不支持native。
- 應(yīng)用場景:
- 適合對速度要求不高,但需要較高的壓縮率的時候,可以作為mapreduce作業(yè)的輸出格式;
- 或者輸出之后的數(shù)據(jù)比較大,處理之后的數(shù)據(jù)需要壓縮存檔減少磁盤空間并且以后數(shù)據(jù)用得比較少的情況;
- 或者對單個很大的文本文件想壓縮減少存儲空間,同時又需要支持split,而且兼容之前的應(yīng)用程序(即應(yīng)用程序不需要修改)的情況。
5.4種壓縮格式的特征的比較
| 壓縮格式 | split | native | 壓縮率 | 速度 | 是否hadoop自帶 | linux命令 | 換成壓縮格式后,原來的應(yīng)用程序是否要修改 |
|---|---|---|---|---|---|---|---|
| gzip | 否 | 是 | 很高 | 比較快 | 是,直接使用 | 有 | 和文本處理一樣,不需要修改 |
| lzo | 是 | 是 | 比較高 | 很快 | 否,需要安裝 | 有 | 需要建索引,還需要指定輸入格式 |
| snappy | 否 | 是 | 比較高 | 很快 | 否,需要安裝 | 沒有 | 和文本處理一樣,不需要修改 |
| bzip2 | 是 | 否 | 最高 | 慢 | 是,直接使用 | 有 | 和文本處理一樣,不需要修改 |
目前CDH集群一般都可選安裝 Hadoop_Lzo,ucloud集群目前是集成了lzo的