本文作者:林偉兵,叩丁狼高級(jí)講師耙册。原創(chuàng)文章给僵,轉(zhuǎn)載請(qǐng)注明出處毫捣。
1. 概述
? 隨著大數(shù)據(jù)時(shí)代的來(lái)臨,數(shù)據(jù)體量越來(lái)越大帝际,處理這些數(shù)據(jù)會(huì)越來(lái)越受到網(wǎng)絡(luò)IO的限制蔓同,為了盡可能多的處理更多的數(shù)據(jù)我們必須使用壓縮。
? 壓縮技術(shù)能夠有效減少底層存儲(chǔ)系統(tǒng)(HDFS) 讀寫(xiě)字節(jié)數(shù)蹲诀。壓縮提高了網(wǎng)絡(luò)帶寬和磁盤(pán)空間的效率斑粱。在 Hadoop 下,尤其是數(shù)據(jù)規(guī)模很大和工作負(fù)載密集的情況下脯爪,使用數(shù)據(jù)壓縮顯得非常重要则北。在這種情況下, I/O 操作和網(wǎng)絡(luò)數(shù)據(jù)傳輸要花大量的時(shí)間痕慢。還有尚揣, Shuffle與 Merge 過(guò)程同樣也面臨著巨大的 I/O 壓力。
? 鑒于磁盤(pán) I/O 和網(wǎng)絡(luò)帶寬是 Hadoop 的寶貴資源掖举,數(shù)據(jù)壓縮對(duì)于節(jié)省資源快骗、最小化磁盤(pán)I/O 和網(wǎng)絡(luò)傳輸非常有幫助。不過(guò), 盡管壓縮與解壓操作的 CPU 開(kāi)銷(xiāo)不高方篮,其性能的提升和資源的節(jié)省并非沒(méi)有代價(jià)名秀。如果磁盤(pán) I/O 和網(wǎng)絡(luò)帶寬影響了 MapReduce 作業(yè)性能,在任意 MapReduce 階段啟用壓縮都可以改善端到端處理時(shí)間并減少 I/O 和網(wǎng)絡(luò)流量藕溅。
2. 四種壓縮
1.gzip壓縮
優(yōu)點(diǎn):壓縮率比較高匕得,而且壓縮/解壓速度也比較快;hadoop本身支持巾表,在應(yīng)用中處理gzip格式的文件就和直接處理文本一樣耗跛;有hadoop native庫(kù);大部分linux系統(tǒng)都自帶gzip命令攒发,使用方便调塌。
缺點(diǎn):不支持split。
應(yīng)用場(chǎng)景:當(dāng)每個(gè)文件壓縮之后在130M以?xún)?nèi)的(1個(gè)塊大小內(nèi))惠猿,都可以考慮用gzip壓縮格式羔砾。譬如說(shuō)一天或者一個(gè)小時(shí)的日志壓縮成一個(gè)gzip 文件,運(yùn)行mapreduce程序的時(shí)候通過(guò)多個(gè)gzip文件達(dá)到并發(fā)偶妖。hive程序姜凄,streaming程序,和java寫(xiě)的mapreduce程序完 全和文本處理一樣趾访,壓縮之后原來(lái)的程序不需要做任何修改态秧。
2.lzo壓縮
優(yōu)點(diǎn):壓縮/解壓速度也比較快,合理的壓縮率扼鞋;支持split申鱼,是hadoop中最流行的壓縮格式;支持hadoop native庫(kù)云头;可以在linux系統(tǒng)下安裝lzop命令捐友,使用方便。
缺點(diǎn):壓縮率比gzip要低一些溃槐;hadoop本身不支持匣砖,需要安裝;在應(yīng)用中對(duì)lzo格式的文件需要做一些特殊處理(為了支持split需要建索引昏滴,還需要指定inputformat為lzo格式)猴鲫。
應(yīng)用場(chǎng)景:一個(gè)很大的文本文件,壓縮之后還大于200M以上的可以考慮谣殊,而且單個(gè)文件越大拂共,lzo優(yōu)點(diǎn)越越明顯。
3.snappy壓縮
優(yōu)點(diǎn):高速壓縮速度和合理的壓縮率蟹倾;支持hadoop native庫(kù)匣缘。
缺點(diǎn):不支持split猖闪;壓縮率比gzip要低;hadoop本身不支持肌厨,需要安裝培慌;linux系統(tǒng)下沒(méi)有對(duì)應(yīng)的命令。
應(yīng)用場(chǎng)景:當(dāng)mapreduce作業(yè)的map輸出的數(shù)據(jù)比較大的時(shí)候柑爸,作為map到reduce的中間數(shù)據(jù)的壓縮格式吵护;或者作為一個(gè)mapreduce作業(yè)的輸出和另外一個(gè)mapreduce作業(yè)的輸入。
4.bzip2壓縮
優(yōu)點(diǎn):支持split表鳍;具有很高的壓縮率馅而,比gzip壓縮率都高;hadoop本身支持譬圣,但不支持native瓮恭;在linux系統(tǒng)下自帶bzip2命令,使用方便厘熟。
缺點(diǎn):壓縮/解壓速度慢屯蹦;不支持native。
應(yīng)用場(chǎng)景:適合對(duì)速度要求不高绳姨,但需要較高的壓縮率的時(shí)候登澜,可以作為mapreduce作業(yè)的輸出格式;或者輸出之后的數(shù)據(jù)比較大飘庄,處理之后的數(shù)據(jù) 需要壓縮存檔減少磁盤(pán)空間并且以后數(shù)據(jù)用得比較少的情況脑蠕;或者對(duì)單個(gè)很大的文本文件想壓縮減少存儲(chǔ)空間,同時(shí)又需要支持split跪削,而且兼容之前的應(yīng)用程 序(即應(yīng)用程序不需要修改)的情況谴仙。
總結(jié):壓縮比:bzip2 > gzip > lzo > snappy ,壓縮速度:snappy > lzo> gzip > bzip2
3. 常用的編碼器
Zlib:org.apache.hadoop.io.compress.DefaultCodec
Gzip:org.apache.hadoop.io.compress.GzioCodec
Bzip2:org.apache.hadoop.io.compress.Bzip2Codec
Lzo:com.apache.compression.lzo.LzoCodec
Lz4:org.apache.hadoop.io.compress.Lz4Codec
Snappy:org.apache.hadoop.io.compress.SnappyCodec
4. 壓縮實(shí)戰(zhàn)
4.1 hadoop的壓縮
1.修改core-site.xml配置文件
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
</value>
</property>
2.修改mapred-site.xml配置文件
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
</value>
</property>
3.修改mapred-site.xml配置文件
<property>
<name>mapreduce.output.fileoutputformat.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.output.fileoutputformat.compress.codec</name>
<value>org.apache.hadoop.io.compress.BZip2Codec</value>
</property>
4.2 MapReduce測(cè)試
[hadoop@hadoop01 ~]$ cd app/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce/
[hadoop@hadoop01 mapreduce]$ hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /tmp/input.txt /tmp/compression-out/
...
[hadoop@hadoop01 mapreduce]$
查看結(jié)果切揭,輸出結(jié)果的壓縮格式為.bz2狞甚,與配置文件一致
[hadoop@hadoop01 mapreduce]$ hdfs dfs -ls /tmp/compression-out/
Found 2 items
-rw-r--r-- 1 hadoop supergroup 0 2018-08-13 20:01 /tmp/compression-out/_SUCCESS
-rw-r--r-- 1 hadoop supergroup 65 2018-08-13 20:01 /tmp/compression-out/part-r-00000.bz2
[hadoop@hadoop01 mapreduce]$ hdfs dfs -text /tmp/compression-out/part-r-00000.bz2
18/08/13 20:02:53 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
18/08/13 20:02:53 INFO compress.CodecPool: Got brand-new decompressor [.bz2]
data 1
is 2
sample 1
test 2
this 2
[hadoop@hadoop01 mapreduce]$
4.3 壓縮位置選擇
壓縮可以在 MapReduce 作用的任意階段啟用锁摔。
4.4 hive的壓縮
? Hive的建表語(yǔ)句里面有一個(gè)STORED AS file_format結(jié)合使用的方法廓旬,指定hive的存儲(chǔ)格式。不僅能節(jié)省hive的存儲(chǔ)空間谐腰,還可以提高執(zhí)行效率孕豹。
不壓縮
在hive創(chuàng)建一張不壓縮的表,把數(shù)據(jù)導(dǎo)進(jìn)去
hive> create table test1(
> c1 string,
> c2 string,
> c3 string,
> c4 string,
> c5 string)
> row format delimited fields terminated by '||';
OK
Time taken: 0.716 seconds
hive> load data local inpath '/home/hadoop/data/20180813000203.txt' overwrite into table test1;
hive> select count(1) from test1;
OK
76241
Time taken: 20.67 seconds, Fetched: 1 row(s)
hive>
此時(shí)hdfs上查看一下文件的大小
[hadoop@hadoop01 data]$ hdfs dfs -du -s -h /user/hive/warehouse/test1
37.4 M 37.4 M /user/hive/warehouse/test1
[hadoop@hadoop01 data]$
bzip2壓縮
在hive創(chuàng)建一張bzip2的表十气,把數(shù)據(jù)導(dǎo)進(jìn)去(查看hive怎么壓縮励背,打開(kāi)hive官網(wǎng),點(diǎn)擊compression)
查看hive當(dāng)前的壓縮格式砸西,默認(rèn)是不壓縮的
hive> SET hive.exec.compress.output;
hive.exec.compress.output=false
hive>
查看hive當(dāng)前的codec叶眉,默認(rèn)是bzip2
hive> SET mapreduce.output.fileoutputformat.compress.codec;
mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec
hive>
設(shè)置一下壓縮格式為bzip2址儒,codec也為bzip2,并且創(chuàng)建一張表
hive> SET hive.exec.compress.output=true;
hive> SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec;
hive> create table test1_bzip2
> row format delimited fields terminated by '||'
> as select * from test1;
去hdfs上查看文件的大小衅疙,文件大小由最初的37.4M變成了450.0K(這里bzip2的壓縮比應(yīng)該是30%左右莲趣,因?yàn)槲业臄?shù)據(jù)本身有很多重復(fù),所以壓縮后體積縮小非常大)饱溢,hdfs上存儲(chǔ)的格式也變成了.bz2
[hadoop@hadoop01 data]$ hdfs dfs -du -s -h /user/hive/warehouse/test1_bzip2
450.0 K 450.0 K /user/hive/warehouse/test1_bzip2
[hadoop@hadoop01 data]$ hdfs dfs -ls /user/hive/warehouse/test1_bzip2
Found 1 items
-rwxr-xr-x 1 hadoop supergroup 460749 2018-08-13 20:32 /user/hive/warehouse/test1_bzip2/000000_0.bz2
想獲取更多技術(shù)干貨喧伞,請(qǐng)前往叩丁狼官網(wǎng):http://www.wolfcode.cn/all_article.html