為什么會(huì)出現(xiàn)需要對(duì)文件進(jìn)行壓縮?
在Hadoop中,文件需要存儲(chǔ)、傳輸、讀取磁盤、寫入磁盤等等操作,而文件的大小,直接決定了這些這些操作的速度。
1、壓縮的好處和壞處
好處
- 減少存儲(chǔ)磁盤空間
- 降低IO(網(wǎng)絡(luò)的IO和磁盤的IO)
- 加快數(shù)據(jù)在磁盤和網(wǎng)絡(luò)中的傳輸速度,從而提高系統(tǒng)的處理速度
壞處
- 由于使用數(shù)據(jù)時(shí),需要先將數(shù)據(jù)解壓,加重CPU負(fù)荷。而且壓縮的越狠,耗費(fèi)的時(shí)間越多。
2、壓縮格式

支持native表示,hadoop自己提供了功能的實(shí)現(xiàn),而不是依賴外部,如bzip2是不支持native,則表示物理機(jī)要另行安裝支持bzip2壓縮的軟件。
3、壓縮測(cè)試
一個(gè)簡(jiǎn)單的案例對(duì)于集中壓縮方式之間的壓縮比和壓縮速度進(jìn)行一個(gè)感觀性的認(rèn)識(shí)
壓縮比

壓縮時(shí)間/解壓時(shí)間

可以看出,壓縮比越高,壓縮時(shí)間越長(zhǎng),壓縮比:SnAppy<LZ4<LZO<GZIP<BZIP2
4、優(yōu)缺點(diǎn)
a. gzip
優(yōu)點(diǎn):壓縮比在四種壓縮方式中較高;hadoop本身支持,在應(yīng)用中處理gzip格式的文件就和直接處理文本一樣;有hadoop native庫(kù);大部分linux系統(tǒng)都自帶gzip命令,使用方便
缺點(diǎn):不支持split
b. lzo
優(yōu)點(diǎn):壓縮/解壓速度也比較快,合理的壓縮率;支持split,是hadoop中最流行的壓縮格式;支持hadoop native庫(kù);需要在linux系統(tǒng)下自行安裝lzop命令,使用方便
缺點(diǎn):壓縮率比gzip要低;hadoop本身不支持,需要安裝;lzo雖然支持split,但需要對(duì)lzo文件建索引,否則hadoop也是會(huì)把lzo文件看成一個(gè)普通文件(為了支持split需要建索引,需要指定inputformat為lzo格式)
c. snappy
優(yōu)點(diǎn):壓縮速度快;支持hadoop native庫(kù)
缺點(diǎn):不支持split;壓縮比低;hadoop本身不支持,需要安裝;linux系統(tǒng)下沒(méi)有對(duì)應(yīng)的命令
d. bzip2
優(yōu)點(diǎn):支持split;具有很高的壓縮率,比gzip壓縮率都高;hadoop本身支持,但不支持native;在linux系統(tǒng)下自帶bzip2命令,使用方便
缺點(diǎn):壓縮/解壓速度慢;不支持native
5、圖解MapReduce

- 第一次傳入壓縮文件,應(yīng)選用可以切片的壓縮方式,否則整個(gè)文件將只有一個(gè)Map執(zhí)行。Use Compressd Map Input:從HDFS中讀取文件進(jìn)行Mapreuce作業(yè),如果數(shù)據(jù)很大,可以使用壓縮并且選擇支持分片的壓縮方式(Bzip2,LZO),可以實(shí)現(xiàn)并行處理,提高效率,減少磁盤讀取時(shí)間,同時(shí)選擇合適的存儲(chǔ)格式例如Sequence Files,RC,ORC等。
- 第二次壓縮應(yīng)選擇壓縮解壓速度快的壓縮方式,生產(chǎn)中,Map階段數(shù)據(jù)落盤通常使用snappy壓縮格式(快速壓縮解壓)。Compress Intermediate Data:Map輸出作為Reducer的輸入,需要經(jīng)過(guò)shuffle這一過(guò)程,需要把數(shù)據(jù)讀取到一個(gè)環(huán)形緩沖區(qū),然后讀取到本地磁盤,所以選擇壓縮可以減少了存儲(chǔ)文件所占空間,提升了數(shù)據(jù)傳輸速率,建議使用壓縮速度快的壓縮方式,例如Snappy和LZO。
- 第三次壓縮有兩種場(chǎng)景分別是:一.當(dāng)輸出文件為下一個(gè)job的輸入,選擇可切分的壓縮方式例如:BZip2。二.當(dāng)輸出文件直接存到HDFS,作為歸檔,選擇壓縮比高的壓縮方式。reduce階段數(shù)據(jù)落盤通常使用gzip或bzip2進(jìn)行壓縮(減少磁盤使用)。Compress Reducer Output:進(jìn)行歸檔處理或者鏈接Mapreduce的工作(該作業(yè)的輸出作為下個(gè)作業(yè)的輸入),壓縮可以減少了存儲(chǔ)文件所占空間,提升了數(shù)據(jù)傳輸速率,如果作為歸檔處理,可以采用高的壓縮比(Gzip,Bzip2),如果作為下個(gè)作業(yè)的輸入,考慮是否要分片進(jìn)行選擇。
6、總結(jié)
不同的場(chǎng)景選擇不同的壓縮方式,肯定沒(méi)有一個(gè)一勞永逸的方法,如果選擇高壓縮比,那么對(duì)于cpu的性能要求要高,同時(shí)壓縮、解壓時(shí)間耗費(fèi)也多;選擇壓縮比低的,對(duì)于磁盤io、網(wǎng)絡(luò)io的時(shí)間要多,空間占據(jù)要多;對(duì)于支持分割的,可以實(shí)現(xiàn)并行處理。
☆若該壓縮格式不支持文件分割,則后續(xù)無(wú)法實(shí)現(xiàn)并行處理,生產(chǎn)優(yōu)化核心是讓每個(gè)文件大小略微低于塊大小,如塊128M文件怎樣為125M。未壓縮的文件是支持文件分割的
7、應(yīng)用場(chǎng)景
一般在HDFS 、Hive、HBase中會(huì)使用;
當(dāng)然一般較多的是結(jié)合Spark 來(lái)一起使用。