一文詳解Hive知識(shí)體系
五、存儲(chǔ)與壓縮
5.1 Hive存儲(chǔ)格式
Hive支持的存儲(chǔ)數(shù)的格式主要有:TEXTFILE(行式存儲(chǔ)) 、SEQUENCEFILE(行式存儲(chǔ))、ORC(列式存儲(chǔ))、PARQUET(列式存儲(chǔ))。
5.1.1 行式存儲(chǔ)和列式存儲(chǔ)
上圖左邊為邏輯表,右邊第一個(gè)為行式存儲(chǔ),第二個(gè)為列式存儲(chǔ)。
行存儲(chǔ)的特點(diǎn): 查詢滿足條件的一整行數(shù)據(jù)的時(shí)候,列存儲(chǔ)則需要去每個(gè)聚集的字段找到對(duì)應(yīng)的每個(gè)列的值,行存儲(chǔ)只需要找到其中一個(gè)值,其余的值都在相鄰地方,所以此時(shí)行存儲(chǔ)查詢的速度更快。select *
列存儲(chǔ)的特點(diǎn): 因?yàn)槊總(gè)字段的數(shù)據(jù)聚集存儲(chǔ),在查詢只需要少數(shù)幾個(gè)字段的時(shí)候,能大大減少讀取的數(shù)據(jù)量;每個(gè)字段的數(shù)據(jù)類型一定是相同的,列式存儲(chǔ)可以針對(duì)性的設(shè)計(jì)更好的設(shè)計(jì)壓縮算法。select 某些字段效率更高。
5.1.2 TEXTFILE
默認(rèn)格式,數(shù)據(jù)不做壓縮,磁盤(pán)開(kāi)銷大,數(shù)據(jù)解析開(kāi)銷大?山Y(jié)合Gzip、Bzip2使用(系統(tǒng)自動(dòng)檢查,執(zhí)行查詢時(shí)自動(dòng)解壓),但使用這種方式,hive不會(huì)對(duì)數(shù)據(jù)進(jìn)行切分,從而無(wú)法對(duì)數(shù)據(jù)進(jìn)行并行操作。
5.1.3 ORC格式
Orc (Optimized Row Columnar)是hive 0.11版里引入的新的存儲(chǔ)格式。
可以看到每個(gè)Orc文件由1個(gè)或多個(gè)stripe組成,每個(gè)stripe250MB大小,這個(gè)Stripe實(shí)際相當(dāng)于RowGroup概念,不過(guò)大小由4MB->250MB,這樣能提升順序讀的吞吐率。每個(gè)Stripe里有三部分組成,分別是Index Data,Row Data,Stripe Footer:
Index Data:一個(gè)輕量級(jí)的index,默認(rèn)是每隔1W行做一個(gè)索引。這里做的索引只是記錄某行的各字段在Row Data中的offset。
Row Data:存的是具體的數(shù)據(jù),先取部分行,然后對(duì)這些行按列進(jìn)行存儲(chǔ)。對(duì)每個(gè)列進(jìn)行了編碼,分成多個(gè)Stream來(lái)存儲(chǔ)。
Stripe Footer:存的是各個(gè)stripe的元數(shù)據(jù)信息
每個(gè)文件有一個(gè)File Footer,這里面存的是每個(gè)Stripe的行數(shù),每個(gè)Column的數(shù)據(jù)類型信息等;每個(gè)文件的尾部是一個(gè)PostScript,這里面記錄了整個(gè)文件的壓縮類型以及FileFooter的長(zhǎng)度信息等。在讀取文件時(shí),會(huì)seek到文件尾部讀PostScript,從里面解析到File Footer長(zhǎng)度,再讀FileFooter,從里面解析到各個(gè)Stripe信息,再讀各個(gè)Stripe,即從后往前讀。
5.1.4 PARQUET格式
Parquet是面向分析型業(yè)務(wù)的列式存儲(chǔ)格式,由Twitter和Cloudera合作開(kāi)發(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文件,Footer length記錄了文件元數(shù)據(jù)的大小,通過(guò)該值和文件長(zhǎng)度可以計(jì)算出元數(shù)據(jù)的偏移量,文件的元數(shù)據(jù)中包括每一個(gè)行組的元數(shù)據(jù)信息和該文件存儲(chǔ)數(shù)據(jù)的Schema信息。除了文件中每一個(gè)行組的元數(shù)據(jù),每一頁(yè)的開(kāi)始都會(huì)存儲(chǔ)該頁(yè)的元數(shù)據(jù),在Parquet中,有三種類型的頁(yè):數(shù)據(jù)頁(yè)、字典頁(yè)和索引頁(yè)。數(shù)據(jù)頁(yè)用于存儲(chǔ)當(dāng)前行組中該列的值,字典頁(yè)存儲(chǔ)該列值的編碼字典,每一個(gè)列塊中最多包含一個(gè)字典頁(yè),索引頁(yè)用來(lái)存儲(chǔ)當(dāng)前行組下該列的索引,目前Parquet中還不支持索引頁(yè)。
5.2 Hive壓縮格式
在實(shí)際工作當(dāng)中,hive當(dāng)中處理的數(shù)據(jù),一般都需要經(jīng)過(guò)壓縮,前期我們?cè)趯W(xué)習(xí)hadoop的時(shí)候,已經(jīng)配置過(guò)hadoop的壓縮,我們這里的hive也是一樣的可以使用壓縮來(lái)節(jié)省我們的MR處理的網(wǎng)絡(luò)帶寬
mr支持的壓縮格式:
壓縮格式工具算法文件擴(kuò)展名是否可切分DEFAULT無(wú)DEFAULT.deflate否GzipgzipDEFAULT.gz否bzip2bzip2bzip2.bz2是LZOlzopLZO.lzo否LZ4無(wú)LZ4.lz4否Snappy無(wú)Snappy.snappy否
hadoop支持的解壓縮的類:
壓縮格式對(duì)應(yīng)的編碼/解碼器DEFLATEorg.a(chǎn)pache.hadoop.io.compress.DefaultCodecgziporg.a(chǎn)pache.hadoop.io.compress.GzipCodecbzip2org.a(chǎn)pache.hadoop.io.compress.BZip2CodecLZOcom.hadoop.compression.lzo.LzopCodecLZ4org.a(chǎn)pache.hadoop.io.compress.Lz4CodecSnappyorg.a(chǎn)pache.hadoop.io.compress.SnappyCodec
壓縮性能的比較:
壓縮算法原始文件大小壓縮文件大小壓縮速度解壓速度gzip8.3GB1.8GB17.5MB/s58MB/sbzip28.3GB1.1GB2.4MB/s9.5MB/sLZO8.3GB2.9GB49.3MB/s74.6MB/s
Snappy生成的壓縮文件要大20%到100%。在64位模式下的core i7處理器的單內(nèi)核上,Snappy以250 MB/秒或更多的速度壓縮,并以500 MB/秒或更多的速度解壓。
實(shí)現(xiàn)壓縮hadoop需要配置的壓縮參數(shù):
hive配置壓縮的方式:
開(kāi)啟map端的壓縮方式:1.1)開(kāi)啟hive中間傳輸數(shù)據(jù)壓縮功能
hive (default)>set hive.exec.compress.intermediate=true;
1.2)開(kāi)啟mapreduce中map輸出壓縮功能
hive (default)>set mapreduce.map.output.compress=true;
1.3)設(shè)置mapreduce中map輸出數(shù)據(jù)的壓縮方式
hive (default)>set mapreduce.map.output.compress.codec= org.a(chǎn)pache.hadoop.io.compress.SnappyCodec;
1.4)執(zhí)行查詢語(yǔ)句
select count(1) from score;
開(kāi)啟reduce端的壓縮方式1)開(kāi)啟hive最終輸出數(shù)據(jù)壓縮功能
hive (default)>set hive.exec.compress.output=true;
2)開(kāi)啟mapreduce最終輸出數(shù)據(jù)壓縮
hive (default)>set mapreduce.output.fileoutputformat.compress=true;
3)設(shè)置mapreduce最終數(shù)據(jù)輸出壓縮方式
hive (default)> set mapreduce.output.fileoutputformat.compress.codec = org.a(chǎn)pache.hadoop.io.compress.SnappyCodec;
4)設(shè)置mapreduce最終數(shù)據(jù)輸出壓縮為塊壓縮
hive (default)>set mapreduce.output.fileoutputformat.compress.type=BLOCK;
5)測(cè)試一下輸出結(jié)果是否是壓縮文件
insert overwrite local directory '/export/servers/snappy' select * from score distribute by s_id sort by s_id desc;
5.3 存儲(chǔ)和壓縮相結(jié)合
ORC存儲(chǔ)方式的壓縮:
KeyDefaultNotesorc.compressZLIB高級(jí)壓縮(可選: NONE, ZLIB, SNAPPY)orc.compress.size262,144每個(gè)壓縮塊中的字節(jié)數(shù)orc.stripe.size67,108,864每條stripe中的字節(jié)數(shù)orc.row.index.stride10,000索引條目之間的行數(shù)(必須是>= 1000)orc.create.indextrue是否創(chuàng)建行索引orc.bloom.filter.columns""逗號(hào)分隔的列名列表,應(yīng)該為其創(chuàng)建bloom過(guò)濾器orc.bloom.filter.fpp0.05bloom過(guò)濾器的假陽(yáng)性概率(必須是>0.0和<1.0)
創(chuàng)建一個(gè)非壓縮的ORC存儲(chǔ)方式:
1)建表語(yǔ)句
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 ' ' STORED AS orc tblproperties ("orc.compress"="NONE");
2)插入數(shù)據(jù)
insert into table log_orc_none select * from log_text ;
3)查看插入后數(shù)據(jù)
dfs -du -h /user/hive/warehouse/myhive.db/log_orc_none;
結(jié)果顯示:
7.7 M /user/hive/warehouse/log_orc_none/123456_0
創(chuàng)建一個(gè)SNAPPY壓縮的ORC存儲(chǔ)方式:
1)建表語(yǔ)句
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 ' ' STORED AS orc tblproperties ("orc.compress"="SNAPPY");
2)插入數(shù)據(jù)
insert into table log_orc_snappy select * from log_text ;
3)查看插入后數(shù)據(jù)
dfs -du -h /user/hive/warehouse/myhive.db/log_orc_snappy ;
結(jié)果顯示:
3.8 M /user/hive/warehouse/log_orc_snappy/123456_0
4)上一節(jié)中默認(rèn)創(chuàng)建的ORC存儲(chǔ)方式,導(dǎo)入數(shù)據(jù)后的大小為
2.8 M /user/hive/warehouse/log_orc/123456_0
比Snappy壓縮的還小。原因是orc存儲(chǔ)文件默認(rèn)采用ZLIB壓縮。比snappy壓縮的小。
5)存儲(chǔ)方式和壓縮總結(jié):
在實(shí)際的項(xiàng)目開(kāi)發(fā)當(dāng)中,hive表的數(shù)據(jù)存儲(chǔ)格式一般選擇:orc或parquet。壓縮方式一般選擇snappy。
5.4 主流存儲(chǔ)文件性能對(duì)比
從存儲(chǔ)文件的壓縮比和查詢速度兩個(gè)角度對(duì)比。
壓縮比比較:
TextFile(1)創(chuàng)建表,存儲(chǔ)數(shù)據(jù)格式為T(mén)EXTFILE
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 ' ' STORED AS TEXTFILE ;
(2)向表中加載數(shù)據(jù)
load data local inpath '/export/servers/hivedatas/log.data' into table log_text ;
(3)查看表中數(shù)據(jù)大小,大小為18.1M
dfs -du -h /user/hive/warehouse/myhive.db/log_text;
結(jié)果顯示:
18.1 M /user/hive/warehouse/log_text/log.data
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 ' ' STORED AS orc ;
(2)向表中加載數(shù)據(jù)
insert into table log_orc select * from log_text ;
(3)查看表中數(shù)據(jù)大小
dfs -du -h /user/hive/warehouse/myhive.db/log_orc;
結(jié)果顯示:
2.8 M /user/hive/warehouse/log_orc/123456_0
Parquet1)創(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 ' ' STORED AS PARQUET ;
2)向表中加載數(shù)據(jù)
insert into table log_parquet select * from log_text ;
3)查看表中數(shù)據(jù)大小
dfs -du -h /user/hive/warehouse/myhive.db/log_parquet;
結(jié)果顯示:
13.1 M /user/hive/warehouse/log_parquet/123456_0
數(shù)據(jù)壓縮比結(jié)論:
ORC > Parquet > textFile
存儲(chǔ)文件的查詢效率測(cè)試
textFilehive (default)> select count(*) from log_text;
_c0
100000
Time taken: 21.54 seconds, Fetched: 1 row(s)
ORChive (default)> select count(*) from log_orc;
_c0
100000
Time taken: 20.867 seconds, Fetched: 1 row(s)
Parquethive (default)> select count(*) from log_parquet;
_c0
100000
Time taken: 22.922 seconds, Fetched: 1 row(s)
存儲(chǔ)文件的查詢效率比較:
ORC > TextFile > Parquet

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會(huì)
-
4月30日立即下載>> 【村田汽車】汽車E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線下巡回】2025年STM32峰會(huì)
-
即日-5.15立即報(bào)名>>> 【在線會(huì)議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書(shū)】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評(píng) >> 【評(píng)選啟動(dòng)】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評(píng)選
推薦專題
-
10 月之暗面,絕地反擊
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開(kāi)始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 “AI寒武紀(jì)”爆發(fā)至今,五類新物種登上歷史舞臺(tái)
- 4 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 5 國(guó)產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來(lái)商業(yè)化突破,但落地仍需時(shí)間
- 7 東陽(yáng)光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開(kāi)成長(zhǎng)空間
- 8 地平線自動(dòng)駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營(yíng)收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?