8.1 Hadoop源碼編譯支持Snappy壓縮(了解)
8.1.1 資源準(zhǔn)備
1)CentOS聯(lián)網(wǎng)?
配置CentOS能連接外網(wǎng)捆交。Linux虛擬機(jī)ping www.baidu.com?是暢通的
注意:采用root角色編譯敬惦,減少文件夾權(quán)限出現(xiàn)問題
2)jar包準(zhǔn)備(hadoop源碼皂冰、JDK8 恶耽、maven痊夭、protobuf)
(1)hadoop-2.8.4-src.tar.gz
(2)jdk-8u144-linux-x64.tar.gz
(3)snappy-1.1.3.tar.gz
(4)apache-maven-3.0.5-bin.tar.gz
(5)protobuf-2.5.0.tar.gz
8.1.2 jar包安裝
0)注意:所有操作必須在root用戶下完成
1)JDK解壓旱捧、配置環(huán)境變量JAVA_HOME和PATH构捡,驗(yàn)證java-version(如下都需要驗(yàn)證是否配置成功)
[root@bigdata111 software] # tar -zxf jdk-8u144-linux-x64.tar.gz -C /opt/module/
[root@bigdata111 software]# vi /etc/profile
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
[root@bigdata111 software]#source /etc/profile
驗(yàn)證命令:java -version
2)Maven解壓液南、配置??MAVEN_HOME和PATH。
[root@bigdata111 software]# tar -zxvf apache-maven-3.0.5-bin.tar.gz -C /opt/module/
[root@bigdata111 apache-maven-3.0.5]# vi /etc/profile
#MAVEN_HOME
export MAVEN_HOME=/opt/module/apache-maven-3.0.5
export PATH=$PATH:$MAVEN_HOME/bin
[root@bigdata111 software]#source /etc/profile
驗(yàn)證命令:mvn -version
8.1.3 編譯源碼
1)準(zhǔn)備編譯環(huán)境
[root@bigdata111 software]# yum install svn
[root@bigdata111 software]# yum install autoconf automake libtool cmake
[root@bigdata111 software]# yum install ncurses-devel
[root@bigdata111 software]# yum install openssl-devel
[root@bigdata111 software]# yum install gcc*
2)編譯安裝snappy
[root@bigdata111 software]# tar -zxvf snappy-1.1.3.tar.gz -C /opt/module/
[root@bigdata111 module]# cd snappy-1.1.3/
[root@bigdata111 snappy-1.1.3]# ./configure
[root@bigdata111 snappy-1.1.3]# make
[root@bigdata111 snappy-1.1.3]# make install
# 查看snappy庫文件
[root@bigdata111 snappy-1.1.3]# ls -lh /usr/local/lib |grep snappy
3)編譯安裝protobuf
[root@bigdata111 software]# tar -zxvf protobuf-2.5.0.tar.gz -C /opt/module/
[root@bigdata111 module]# cd protobuf-2.5.0/
[root@bigdata111 protobuf-2.5.0]# ./configure?
[root@bigdata111 protobuf-2.5.0]# ?make?
[root@bigdata111 protobuf-2.5.0]# ?make install
# 查看protobuf版本以測試是否安裝成功
[root@bigdata111 protobuf-2.5.0]# protoc --version
4)編譯hadoop native
[root@bigdata111 software]# tar -zxvf hadoop-2.8.4-src.tar.gz
[root@bigdata111 software]# cd hadoop-2.8.4-src/
[root@bigdata111 software]# mvn clean package -DskipTests -Pdist,native -Dtar -Dsnappy.lib=/usr/local/lib -Dbundle.snappy
執(zhí)行成功后勾徽,/opt/software/hadoop-2.8.4-src/hadoop-dist/target/hadoop-2.8.4.tar.gz即為新生成的支持snappy壓縮的二進(jìn)制安裝包滑凉。
8.2 Hadoop壓縮配置
8.2.1 MR支持的壓縮編碼
壓縮格式工具算法文件擴(kuò)展名是否可切分
DEFAULT無DEFAULT.deflate否
GzipgzipDEFAULT.gz否
bzip2bzip2bzip2.bz2是
LZOlzopLZO.lzo是
Snappy無Snappy.snappy否
為了支持多種壓縮/解壓縮算法,Hadoop引入了編碼/解碼器喘帚,如下表所示
壓縮格式對(duì)應(yīng)的編碼/解碼器
DEFLATEorg.apache.hadoop.io.compress.DefaultCodec
gziporg.apache.hadoop.io.compress.GzipCodec
bzip2org.apache.hadoop.io.compress.BZip2Codec
LZOcom.hadoop.compression.lzo.LzopCodec
Snappyorg.apache.hadoop.io.compress.SnappyCodec
壓縮性能的比較
壓縮算法原始文件大小壓縮文件大小壓縮速度解壓速度
gzip8.3GB1.8GB17.5MB/s58MB/s
bzip28.3GB1.1GB2.4MB/s9.5MB/s
LZO8.3GB2.9GB49.3MB/s74.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.
8.2.2 壓縮參數(shù)配置
要在Hadoop中啟用壓縮畅姊,可以配置如下參數(shù)(mapred-site.xml文件中):
參數(shù)默認(rèn)值階段建議
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使用文件擴(kuò)展名判斷是否支持某種編解碼器
mapreduce.map.output.compressfalsemapper輸出這個(gè)參數(shù)設(shè)為true啟用壓縮
mapreduce.map.output.compress.codecorg.apache.hadoop.io.compress.DefaultCodecmapper輸出使用LZO、LZ4或snappy編解碼器在此階段壓縮數(shù)據(jù)
mapreduce.output.fileoutputformat.compressfalsereducer輸出這個(gè)參數(shù)設(shè)為true啟用壓縮
mapreduce.output.fileoutputformat.compress.codecorg.apache.hadoop.io.compress. DefaultCodecreducer輸出使用標(biāo)準(zhǔn)工具或者編解碼器吹由,如gzip和bzip2
mapreduce.output.fileoutputformat.compress.typeRECORDreducer輸出SequenceFile輸出使用的壓縮類型:NONE和BLOCK
8.3 開啟Map輸出階段壓縮
開啟map輸出階段壓縮可以減少job中map和Reduce task間數(shù)據(jù)傳輸量若未。具體配置如下:
案例實(shí)操:
1)開啟hive中間傳輸數(shù)據(jù)壓縮功能,默認(rèn)為false
hive (default)>set hive.exec.compress.intermediate=true;
2)開啟mapreduce中map輸出壓縮功能,默認(rèn)為false
hive (default)>set mapreduce.map.output.compress=true;
3)設(shè)置mapreduce中map輸出數(shù)據(jù)的壓縮方式
hive (default)>set mapreduce.map.output.compress.codec= org.apache.hadoop.io.compress.SnappyCodec;
4)執(zhí)行查詢語句
hive (default)> select count(ename) name from emp;
8.4 開啟Reduce輸出階段壓縮
當(dāng)Hive將輸出寫入到表中時(shí),輸出內(nèi)容同樣可以進(jìn)行壓縮倾鲫。屬性hive.exec.compress.output控制著這個(gè)功能陨瘩。用戶可能需要保持默認(rèn)設(shè)置文件中的默認(rèn)值false,這樣默認(rèn)的輸出就是非壓縮的純文本文件了级乍。用戶可以通過在查詢語句或執(zhí)行腳本中設(shè)置這個(gè)值為true,來開啟輸出結(jié)果壓縮功能帚湘。
案例實(shí)操:
hive (default)> set mapreduce.job.reduces=3;
1)開啟hive最終輸出數(shù)據(jù)壓縮功能,默認(rèn)為false
hive (default)>set hive.exec.compress.output=true;
2)開啟mapreduce最終輸出數(shù)據(jù)壓縮,默認(rèn)為false
hive (default)>set mapreduce.output.fileoutputformat.compress=true;
3)設(shè)置mapreduce最終數(shù)據(jù)輸出壓縮方式
hive (default)> set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
4)設(shè)置mapreduce最終數(shù)據(jù)輸出壓縮為塊壓縮
hive (default)> set mapreduce.output.fileoutputformat.compress.type=BLOCK;
5)測試一下輸出結(jié)果是否是壓縮文件
hive (default)> insert overwrite local directory '/opt/module/datas/distribute-result' select * from emp distribute by deptno sort by empno desc;
測試:不設(shè)置reduce玫荣,結(jié)果是否是壓縮格式
hive (default)> set mapreduce.job.reduces=-1;
insert overwrite local directory '/opt/module/datas/distribute-result' select * from test;
8.5 文件存儲(chǔ)格式
Hive支持的存儲(chǔ)數(shù)的格式主要有:TEXTFILE?、SEQUENCEFILE大诸、ORC捅厂、PARQUET。
簡寫:
行儲(chǔ)存:textFile 资柔、?sequencefile 焙贷、
列儲(chǔ)存:orc 、parquet
8.5.1 列式存儲(chǔ)和行式存儲(chǔ)
上圖左邊為邏輯表贿堰,右邊第一個(gè)為行式存儲(chǔ)辙芍,第二個(gè)為列式存儲(chǔ)。
行存儲(chǔ)的特點(diǎn):查詢滿足條件的一整行數(shù)據(jù)的時(shí)候,列存儲(chǔ)則需要去每個(gè)聚集的字段找到對(duì)應(yīng)的每個(gè)列的值故硅,行存儲(chǔ)只需要找到其中一個(gè)值庶灿,其余的值都在相鄰地方,所以此時(shí)行存儲(chǔ)查詢的速度更快吃衅。
列存儲(chǔ)的特點(diǎn):因?yàn)槊總€(gè)字段的數(shù)據(jù)聚集存儲(chǔ)往踢,在查詢只需要少數(shù)幾個(gè)字段的時(shí)候,能大大減少讀取的數(shù)據(jù)量徘层;每個(gè)字段的數(shù)據(jù)類型一定是相同的峻呕,列式存儲(chǔ)可以針對(duì)性的設(shè)計(jì)更好的設(shè)計(jì)壓縮算法。
TEXTFILE和SEQUENCEFILE的存儲(chǔ)格式都是基于行存儲(chǔ)的趣效;
ORC和PARQUET是基于列式存儲(chǔ)的瘦癌。
8.5.2 TextFile格式
默認(rèn)格式,數(shù)據(jù)不做壓縮英支,磁盤開銷大佩憾,數(shù)據(jù)解析開銷大「苫ǎ可結(jié)合Gzip妄帘、Bzip2使用,但使用Gzip這種方式池凄,hive不會(huì)對(duì)數(shù)據(jù)進(jìn)行切分抡驼,從而無法對(duì)數(shù)據(jù)進(jìn)行并行操作。
8.5.3 Orc格式
Orc (Optimized Row Columnar)是Hive 0.11版里引入的新的存儲(chǔ)格式肿仑。
可以看到每個(gè)Orc文件由1個(gè)或多個(gè)stripe組成致盟,每個(gè)stripe250MB大小,這個(gè)Stripe實(shí)際相當(dāng)于RowGroup概念尤慰,不過大小由4MB->250MB馏锡,這樣應(yīng)該能提升順序讀的吞吐率。每個(gè)Stripe里有三部分組成伟端,分別是Index Data杯道,Row Data,Stripe Footer:
???1)Index Data:一個(gè)輕量級(jí)的index责蝠,默認(rèn)是每隔1W行做一個(gè)索引党巾。這里做的索引應(yīng)該只是記錄某行的各字段在Row Data中的offset。
????2)Row Data:存的是具體的數(shù)據(jù)霜医,先取部分行齿拂,然后對(duì)這些行按列進(jìn)行存儲(chǔ)。對(duì)每個(gè)列進(jìn)行了編碼肴敛,分成多個(gè)Stream來存儲(chǔ)署海。
????3)Stripe Footer:存的是各個(gè)Stream的類型,長度等信息。
每個(gè)文件有一個(gè)File Footer叹侄,這里面存的是每個(gè)Stripe的行數(shù)巩搏,每個(gè)Column的數(shù)據(jù)類型信息等;每個(gè)文件的尾部是一個(gè)PostScript趾代,這里面記錄了整個(gè)文件的壓縮類型以及FileFooter的長度信息等贯底。在讀取文件時(shí),會(huì)seek到文件尾部讀PostScript撒强,從里面解析到File Footer長度禽捆,再讀FileFooter,從里面解析到各個(gè)Stripe信息飘哨,再讀各個(gè)Stripe胚想,即從后往前讀。
8.5.4 Parquet格式
Parquet是面向分析型業(yè)務(wù)的列式存儲(chǔ)格式芽隆,由Twitter和Cloudera合作開發(fā)浊服,2015年5月從Apache的孵化器里畢業(yè)成為Apache頂級(jí)項(xiàng)目。
Parquet文件是以二進(jìn)制方式存儲(chǔ)的胚吁,所以是不可以直接讀取的牙躺,文件中包括該文件的數(shù)據(jù)和元數(shù)據(jù),因此Parquet格式文件是自解析的腕扶。
通常情況下孽拷,在存儲(chǔ)Parquet數(shù)據(jù)的時(shí)候會(huì)按照Block大小設(shè)置行組的大小,由于一般情況下每一個(gè)Mapper任務(wù)處理數(shù)據(jù)的最小單位是一個(gè)Block半抱,這樣可以把每一個(gè)行組由一個(gè)Mapper任務(wù)處理脓恕,增大任務(wù)執(zhí)行并行度。Parquet文件的格式如下圖所示窿侈。
上圖展示了一個(gè)Parquet文件的內(nèi)容炼幔,一個(gè)文件中可以存儲(chǔ)多個(gè)行組,文件的首位都是該文件的Magic Code史简,用于校驗(yàn)它是否是一個(gè)Parquet文件江掩,F(xiàn)ooter length記錄了文件元數(shù)據(jù)的大小,通過該值和文件長度可以計(jì)算出元數(shù)據(jù)的偏移量乘瓤,文件的元數(shù)據(jù)中包括每一個(gè)行組的元數(shù)據(jù)信息和該文件存儲(chǔ)數(shù)據(jù)的Schema信息。除了文件中每一個(gè)行組的元數(shù)據(jù)策泣,每一頁的開始都會(huì)存儲(chǔ)該頁的元數(shù)據(jù)衙傀,在Parquet中,有三種類型的頁:數(shù)據(jù)頁萨咕、字典頁和索引頁统抬。數(shù)據(jù)頁用于存儲(chǔ)當(dāng)前行組中該列的值,字典頁存儲(chǔ)該列值的編碼字典,每一個(gè)列塊中最多包含一個(gè)字典頁聪建,索引頁用來存儲(chǔ)當(dāng)前行組下該列的索引钙畔,目前Parquet中還不支持索引頁。
8.5.5 主流文件存儲(chǔ)格式對(duì)比實(shí)驗(yàn)
從存儲(chǔ)文件的壓縮比和查詢速度兩個(gè)角度對(duì)比金麸。
存儲(chǔ)文件的壓縮比測試:
0)測試數(shù)據(jù)(log.data 大小為18.1MB)
1)TextFile
(1)創(chuàng)建表擎析,存儲(chǔ)數(shù)據(jù)格式為TEXTFILE
create table log_text (
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as textfile ;
(2)向表中加載數(shù)據(jù)
hive (default)> load data local inpath '/opt/module/datas/log.data' into table log_text ;
(3)查看表中數(shù)據(jù)大小
hive (default)> dfs -du -h /user/hive/warehouse/log_text;
18.1 M ?/user/hive/warehouse/log_text/log.data
2)ORC
(1)創(chuàng)建表,存儲(chǔ)數(shù)據(jù)格式為ORC
create table log_orc(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as orc ;
(2)向表中加載數(shù)據(jù)
hive (default)> insert into table log_orc select * from log_text ;
(3)查看表中數(shù)據(jù)大小
hive (default)> dfs -du -h /user/hive/warehouse/log_orc/ ;
2.8 M ?/user/hive/warehouse/log_orc/000000_0
3)Parquet
(1)創(chuàng)建表挥下,存儲(chǔ)數(shù)據(jù)格式為parquet
create table log_parquet(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as parquet ;
(2)向表中加載數(shù)據(jù)
hive (default)> insert into table log_parquet select * from log_text ;
(3)查看表中數(shù)據(jù)大小
hive (default)> dfs -du -h /user/hive/warehouse/log_parquet/ ;
13.1 M ?/user/hive/warehouse/log_parquet/000000_0
存儲(chǔ)文件的壓縮比總結(jié):
ORC > ?Parquet > ?textFile
存儲(chǔ)文件的查詢速度測試:
1)TextFile
hive (default)> select count(*) from log_text;
_c0
100000
Time taken: 21.54 seconds,?Fetched: 1 row(s)
Time taken: 21.08 seconds, Fetched: 1 row(s)
2)ORC
hive (default)> select count(*) from log_orc;
_c0
100000
Time taken:?20.867 seconds, Fetched: 1 row(s)
Time taken: 22.667 seconds, Fetched: 1 row(s)
3)Parquet
hive (default)> select count(*) from log_parquet;
_c0
100000
Time taken: 22.922 seconds,?Fetched: 1 row(s)
Time taken: 21.074 seconds, Fetched: 1 row(s)
存儲(chǔ)文件的查詢速度總結(jié):查詢速度相近揍魂。
8.6 存儲(chǔ)和壓縮結(jié)合
8.6.1 修改Hadoop集群具有Snappy壓縮方式
1)查看hadoop checknative命令使用
[itstar@bigdata113 hadoop-2.8.4]$ hadoop
?? checknative [-a|-h] ?check native hadoop and compression libraries availability
2)查看hadoop支持的壓縮方式
[itstar@bigdata113 hadoop-2.8.4]$ hadoop checknative
17/12/24 20:32:52 WARN bzip2.Bzip2Factory: Failed to load/initialize native-bzip2 library system-native, will use pure-Java version
17/12/24 20:32:52 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop: ?true /opt/module/hadoop-2.8.4/lib/native/libhadoop.so
zlib: ???true /lib64/libz.so.1
snappy: ?false
lz4: ????true revision:99
bzip2: ??true
3)將編譯好的支持Snappy壓縮的hadoop-2.8.4.tar.gz包導(dǎo)入到bigdata111的/opt/software中
4)解壓hadoop-2.8.4.tar.gz到當(dāng)前路徑
[itstar@bigdata111software]$ tar -zxvf hadoop-2.8.4.tar.gz
5)進(jìn)入到/opt/software/hadoop-2.8.4/lib/native路徑可以看到支持Snappy壓縮的動(dòng)態(tài)鏈接庫
[itstar@bigdata111native]$ pwd
/opt/software/hadoop-2.8.4/lib/native
[itstar@bigdata111native]$ ll
-rw-r--r--. 1 itstar itstar ?472950 9月???1 10:19 libsnappy.a
-rwxr-xr-x. 1 itstar itstar ????955 9月???1 10:19 libsnappy.la
lrwxrwxrwx. 1 itstar itstar ?????18 12月?24 20:39 libsnappy.so -> libsnappy.so.1.3.0
lrwxrwxrwx. 1 itstar itstar ?????18 12月?24 20:39 libsnappy.so.1 -> libsnappy.so.1.3.0
-rwxr-xr-x. 1 itstar itstar ?228177 9月???1 10:19 libsnappy.so.1.3.0
6)拷貝/opt/software/hadoop-2.8.4/lib/native里面的所有內(nèi)容到開發(fā)集群的/opt/module/hadoop-2.8.4/lib/native路徑上
[itstar@bigdata111native]$ cp ../native/* /opt/module/hadoop-2.8.4/lib/native/
7)分發(fā)集群scp 到其他集群目錄
[itstar@bigdata111lib]$ scp - r ./native/?root@主機(jī)名:絕對(duì)路徑
8)再次查看hadoop支持的壓縮類型
[itstar@bigdata111hadoop-2.8.4]$ hadoop checknative
17/12/24 20:45:02 WARN bzip2.Bzip2Factory: Failed to load/initialize native-bzip2 library system-native, will use pure-Java version
17/12/24 20:45:02 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop: ?true /opt/module/hadoop-2.8.4/lib/native/libhadoop.so
zlib: ???true?/lib64/libz.so.1
snappy: ?true?/opt/module/hadoop-2.8.4/lib/native/libsnappy.so.1
lz4: ????true revision:99
bzip2: ??false
9)重新啟動(dòng)hadoop集群和hive
8.6.2 測試存儲(chǔ)和壓縮
官網(wǎng):https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC
ORC存儲(chǔ)方式的壓縮:
KeyDefaultNotes
orc.compressZLIBhigh level compression (one of NONE, ZLIB, SNAPPY)
orc.compress.size262,144number of bytes in each compression chunk
orc.stripe.size67,108,864number of bytes in each stripe
orc.row.index.stride10,000number of rows between index entries (must be >= 1000)
orc.create.indextruewhether to create row indexes
orc.bloom.filter.columns""comma separated list of column names for which bloom filter should be created
orc.bloom.filter.fpp0.05false positive probability for bloom filter (must >0.0 and <1.0)
1)創(chuàng)建一個(gè)非壓縮的的ORC存儲(chǔ)方式
(1)建表語句
create table log_orc_none(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as orc tblproperties ("orc.compress"="NONE");
(2)插入數(shù)據(jù)
hive (default)> insert into table log_orc_none select * from log_text ;
(3)查看插入后數(shù)據(jù)
hive (default)> dfs -du -h /user/hive/warehouse/log_orc_none/ ;
7.7 M ?/user/hive/warehouse/log_orc_none/000000_0
2)創(chuàng)建一個(gè)SNAPPY壓縮的ORC存儲(chǔ)方式
(1)建表語句
create table log_orc_snappy(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as orc tblproperties ("orc.compress"="SNAPPY");
(2)插入數(shù)據(jù)
hive (default)> insert into table log_orc_snappy select * from log_text ;
(3)查看插入后數(shù)據(jù)
hive (default)> dfs -du -h /user/hive/warehouse/log_orc_snappy/ ;
3.8 M ?/user/hive/warehouse/log_orc_snappy/000000_0
3)上一節(jié)中默認(rèn)創(chuàng)建的ORC存儲(chǔ)方式,導(dǎo)入數(shù)據(jù)后的大小為
2.8 M??/user/hive/warehouse/log_orc/000000_0
比Snappy壓縮的還小棚瘟。原因是orc存儲(chǔ)文件默認(rèn)采用ZLIB壓縮现斋。比snappy壓縮的小。
4)存儲(chǔ)方式和壓縮總結(jié):
在實(shí)際的項(xiàng)目開發(fā)當(dāng)中偎蘸,hive表的數(shù)據(jù)存儲(chǔ)格式一般選擇:orc或parquet庄蹋。壓縮方式一般選擇snappy,lzo迷雪。