中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

14、Hive壓縮、存儲原理詳解與實戰(zhàn)

14、Hive壓縮、存儲原理詳解與實戰(zhàn)

成都創(chuàng)新互聯(lián)是一家網(wǎng)站設(shè)計、成都網(wǎng)站制作,提供網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,網(wǎng)站制作,建網(wǎng)站,按需求定制網(wǎng)站,網(wǎng)站開發(fā)公司,于2013年創(chuàng)立是互聯(lián)行業(yè)建設(shè)者,服務(wù)者。以提升客戶品牌價值為核心業(yè)務(wù),全程參與項目的網(wǎng)站策劃設(shè)計制作,前端開發(fā),后臺程序制作以及后期項目運營并提出專業(yè)建議和思路。

1、Hive 壓縮

1.1數(shù)據(jù)壓縮說明

壓縮模式評價:

(1)壓縮比

(2)壓縮時間

(3)已經(jīng)壓縮的是否可以再分割;可以分割的格式允許單一文件有多個Mapper程序處理,才可以更好的并行化。

Hadoop編碼/解碼器方式:

1.2數(shù)據(jù)壓縮使用

  • 壓縮模式評價

    • 可使用以下三種標(biāo)準(zhǔn)對壓縮方式進行評價
    • 1、壓縮比:壓縮比越高,壓縮后文件越小,所以壓縮比越高越好
    • 2、壓縮時間:越快越好
    • 3、已經(jīng)壓縮的格式文件是否可以再分割:可以分割的格式允許單一文件由多個Mapper程序處理,可以更好的并行化
  • 常見壓縮格式
壓縮方式壓縮比壓縮速度解壓縮速度是否可分割
gzip 13.4% 21 MB/s 118 MB/s
bzip2 13.2% 2.4MB/s 9.5MB/s
lzo 20.5% 135 MB/s 410 MB/s
snappy 22.2% 172 MB/s 409 MB/s

Hadoop編碼/解碼器方式

壓縮格式對應(yīng)的編碼/解碼器
DEFLATE org.apache.hadoop.io.compress.DefaultCodec
Gzip org.apache.hadoop.io.compress.GzipCodec
BZip2 org.apache.hadoop.io.compress.BZip2Codec
LZO com.hadoop.compress.lzo.LzopCodec
Snappy org.apache.hadoop.io.compress.SnappyCodec

1.3、壓縮配置參數(shù)

要在Hadoop中啟用壓縮,可以配置如下參數(shù)(mapred-site.xml文件中):

參數(shù)默認值階段建議
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使用文件擴展名判斷是否支持某種編解碼器
mapreduce.map.output.compress false mapper輸出 這個參數(shù)設(shè)為true啟用壓縮
mapreduce.map.output.compress.codec org.apache.hadoop.io.compress.DefaultCodec mapper輸出 使用LZO、LZ4或snappy編解碼器在此階段壓縮數(shù)據(jù)
mapreduce.output.fileoutputformat.compress false reducer輸出 這個參數(shù)設(shè)為true啟用壓縮
mapreduce.output.fileoutputformat.compress.codec org.apache.hadoop.io.compress. DefaultCodec reducer輸出 使用標(biāo)準(zhǔn)工具或者編解碼器,如gzip和bzip2
mapreduce.output.fileoutputformat.compress.type RECORD reducer輸出 SequenceFile輸出使用的壓縮類型:NONE和BLOCK

1.4、開啟Map輸出階段壓縮

開啟map輸出階段壓縮可以減少job中map和Reduce task間數(shù)據(jù)傳輸量。具體配置如下:

案例實操:

1)開啟hive中間傳輸數(shù)據(jù)壓縮功能
hive (default)>set hive.exec.compress.intermediate=true;

2)開啟mapreduce中map輸出壓縮功能
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í)行查詢語句
select count(1) from score;

1.5、開啟Reduce輸出階段壓縮

當(dāng)Hive將輸出寫入到表中時,輸出內(nèi)容同樣可以進行壓縮。屬性hive.exec.compress.output控制著這個功能。用戶可能需要保持默認設(shè)置文件中的默認值false,這樣默認的輸出就是非壓縮的純文本文件了。用戶可以通過在查詢語句或執(zhí)行腳本中設(shè)置這個值為true,來開啟輸出結(jié)果壓縮功能。

1)開啟hive最終輸出數(shù)據(jù)壓縮功能
hive (default)>set hive.exec.compress.output=true;

2)開啟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.apache.hadoop.io.compress.SnappyCodec;

4)設(shè)置mapreduce最終數(shù)據(jù)輸出壓縮為塊壓縮
hive (default)>set mapreduce.output.fileoutputformat.compress.type=BLOCK;

5)測試一下輸出結(jié)果是否是壓縮文件
insert overwrite local directory '/kkb/install/hivedatas/snappy' select * from score distribute by s_id sort by s_id desc;

2、Hive 存儲

2.1、hive表的文件存儲格式

Hive支持的存儲數(shù)的格式主要有:TEXTFILE(行式存儲) 、SEQUENCEFILE(行式存儲)、ORC(列式存儲)、PARQUET(列式存儲)。

1、列式存儲和行式存儲

14、Hive壓縮、存儲原理詳解與實戰(zhàn)
上圖左邊為邏輯表,右邊第一個為行式存儲,第二個為列式存儲。

行存儲的特點:查詢滿足條件的一整行數(shù)據(jù)的時候,列存儲則需要去每個聚集的字段找到對應(yīng)的每個列的值,行存儲只需要找到其中一個值,其余的值都在相鄰地方,所以此時行存儲查詢的速度更快。select *

列存儲的特點:因為每個字段的數(shù)據(jù)聚集存儲,在查詢只需要少數(shù)幾個字段的時候,能大大減少讀取的數(shù)據(jù)量;每個字段的數(shù)據(jù)類型一定是相同的,列式存儲可以針對性的設(shè)計更好的設(shè)計壓縮算法。select某些字段效率更高

TEXTFILE和SEQUENCEFILE的存儲格式都是基于行存儲的;

ORC和PARQUET是基于列式存儲的。

2.1.1、TEXTFILE格式

默認格式,數(shù)據(jù)不做壓縮,磁盤開銷大,數(shù)據(jù)解析開銷大??山Y(jié)合Gzip、Bzip2使用(系統(tǒng)自動檢查,執(zhí)行查詢時自動解壓),但使用這種方式,hive不會對數(shù)據(jù)進行切分,從而無法對數(shù)據(jù)進行并行操作。

2.1.2、ORC格式

Orc (Optimized Row Columnar)是hive 0.11版里引入的新的存儲格式。

可以看到每個Orc文件由1個或多個stripe組成,每個stripe250MB大小,這個Stripe實際相當(dāng)于RowGroup概念,不過大小由4MB->250MB,這樣能提升順序讀的吞吐率。每個Stripe里有三部分組成,分別是Index Data,Row Data,Stripe Footer:
14、Hive壓縮、存儲原理詳解與實戰(zhàn)
一個orc文件可以分為若干個Stripe

一個stripe可以分為三個部分

indexData:某些列的索引數(shù)據(jù)

rowData :真正的數(shù)據(jù)存儲

StripFooter:stripe的元數(shù)據(jù)信息

1)Index Data:一個輕量級的index,默認是每隔1W行做一個索引。這里做的索引只是記錄某行的各字段在Row Data中的offset。

? 2)Row Data:存的是具體的數(shù)據(jù),先取部分行,然后對這些行按列進行存儲。對每個列進行了編碼,分成多個Stream來存儲。

? 3)Stripe Footer:存的是各個stripe的元數(shù)據(jù)信息

每個文件有一個File Footer,這里面存的是每個Stripe的行數(shù),每個Column的數(shù)據(jù)類型信息等;每個文件的尾部是一個PostScript,這里面記錄了整個文件的壓縮類型以及FileFooter的長度信息等。在讀取文件時,會seek到文件尾部讀PostScript,從里面解析到File Footer長度,再讀FileFooter,從里面解析到各個Stripe信息,再讀各個Stripe,即從后往前讀。

2.1.3、PARQUET格式

Parquet是面向分析型業(yè)務(wù)的列式存儲格式,由Twitter和Cloudera合作開發(fā),2015年5月從Apache的孵化器里畢業(yè)成為Apache頂級項目。

Parquet文件是以二進制方式存儲的,所以是不可以直接讀取的,文件中包括該文件的數(shù)據(jù)和元數(shù)據(jù),因此Parquet格式文件是自解析的。

通常情況下,在存儲Parquet數(shù)據(jù)的時候會按照Block大小設(shè)置行組的大小,由于一般情況下每一個Mapper任務(wù)處理數(shù)據(jù)的最小單位是一個Block,這樣可以把每一個行組由一個Mapper任務(wù)處理,增大任務(wù)執(zhí)行并行度。Parquet文件的格式如下圖所示。

2.2、主流文件存儲格式對比實驗

從存儲文件的壓縮比和查詢速度兩個角度對比。

存儲文件的壓縮比測試:

測試數(shù)據(jù) 參見log.data

1)TextFile

(1)創(chuàng)建表,存儲數(shù)據(jù)格式為TEXTFILE

use myhive;
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ù)

load data local inpath '/kkb/install/hivedatas/log.data' into table log_text ;

(3)查看表中數(shù)據(jù)大小,大小為18.1M

dfs -du -h /user/hive/warehouse/myhive.db/log_text;
18.1 M  /user/hive/warehouse/log_text/log.data
2)ORC

(1)創(chuàng)建表,存儲數(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ù)

insert into table log_orc select * from log_text ;

(3)查看表中數(shù)據(jù)大小

dfs -du -h /user/hive/warehouse/myhive.db/log_orc;

2.8 M  /user/hive/warehouse/log_orc/123456_0

orc這種存儲格式,默認使用了zlib壓縮方式來對數(shù)據(jù)進行壓縮,所以數(shù)據(jù)會變成了2.8M,非常小

3)Parquet

(1)創(chuàng)建表,存儲數(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ù)

insert into table log_parquet select * from log_text ;

(3)查看表中數(shù)據(jù)大小

dfs -du -h /user/hive/warehouse/myhive.db/log_parquet;

13.1 M  /user/hive/warehouse/log_parquet/123456_0

存儲文件的壓縮比總結(jié):

ORC >  Parquet >  textFile

存儲文件的查詢速度測試:

1)TextFile
hive (default)> select count(*) from log_text;
_c0
100000
Time taken: 21.54 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)  

3)Parquet
hive (default)> select count(*) from log_parquet; 
_c0
100000
Time taken: 22.922 seconds, Fetched: 1 row(s)

存儲文件的查詢速度總結(jié):
ORC > TextFile > Parquet

3、存儲和壓縮結(jié)合

**

1)TextFile
hive (default)> select count(*) from log_text;
_c0
100000
Time taken: 21.54 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)  

3)Parquet
hive (default)> select count(*) from log_parquet; 
_c0
100000
Time taken: 22.922 seconds, Fetched: 1 row(s)

存儲文件的查詢速度總結(jié):
ORC > TextFile > Parquet

2、存儲和壓縮結(jié)合

官網(wǎng):https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC

ORC存儲方式的壓縮:

KeyDefaultNotes
orc.compress ZLIB high level compression (one of NONE, ZLIB, SNAPPY)
orc.compress.size 262,144 number of bytes in each compression chunk
orc.stripe.size 67,108,864 number of bytes in each stripe
orc.row.index.stride 10,000 number of rows between index entries (must be >= 1000)
orc.create.index true whether to create row indexes
orc.bloom.filter.columns "" comma separated list of column names for which bloom filter should be created
orc.bloom.filter.fpp 0.05 false positive probability for bloom filter (must >0.0 and <1.0)
1)創(chuàng)建一個非壓縮的的ORC存儲方式

(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ù)

insert into table log_orc_none select * from log_text ;

(3)查看插入后數(shù)據(jù)

dfs -du -h /user/hive/warehouse/myhive.db/log_orc_none;

7.7 M  /user/hive/warehouse/log_orc_none/123456_0
2)創(chuàng)建一個SNAPPY壓縮的ORC存儲方式

(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ù)

insert into table log_orc_snappy select * from log_text ;

(3)查看插入后數(shù)據(jù)

dfs -du -h /user/hive/warehouse/myhive.db/log_orc_snappy ;
3.8 M  /user/hive/warehouse/log_orc_snappy/123456_0

3)上一節(jié)中默認創(chuàng)建的ORC存儲方式,導(dǎo)入數(shù)據(jù)后的大小為

2.8 M  /user/hive/warehouse/log_orc/123456_0

比Snappy壓縮的還小。原因是orc存儲文件默認采用ZLIB壓縮。比snappy壓縮的小。

4)存儲方式和壓縮總結(jié):

? 在實際的項目開發(fā)當(dāng)中,hive表的數(shù)據(jù)存儲格式一般選擇:orc或parquet。壓縮方式一般選擇snappy。

3、Hiv SerDe

3.1、SerDe介紹

? Serde是 ==Serializer/Deserializer==的簡寫。hive使用Serde進行行對象的序列與反序列化。最后實現(xiàn)把文件內(nèi)容映射到 hive 表中的字段數(shù)據(jù)類型。

? 為了更好的闡述使用 SerDe 的場景,我們需要了解一下 Hive 是如何讀數(shù)據(jù)的(類似于HDFS 中數(shù)據(jù)的讀寫操作):

HDFS files –> InputFileFormat –> <key, value> –> Deserializer –> Row object

Row object –> Serializer –> <key, value> –> OutputFileFormat –> HDFS files

3.2、Hive的SerDe 類型

  • Hive 中內(nèi)置==org.apache.hadoop.hive.serde2== 庫,內(nèi)部封裝了很多不同的SerDe類型。
  • hive創(chuàng)建表時, 通過自定義的SerDe或使用Hive內(nèi)置的SerDe類型指定數(shù)據(jù)的序列化和反序列化方式。
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
[(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
[CLUSTERED BY (col_name, col_name, ...) 
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
[ROW FORMAT row_format] 
[STORED AS file_format] 
[LOCATION hdfs_path]
  • 如上創(chuàng)建表語句, 使用==row format 參數(shù)說明SerDe的類型。==

  • 你可以創(chuàng)建表時使用用戶自定義的Serde或者native Serde, 如果 ROW FORMAT沒有指定或者指定了 ROW FORMAT DELIMITED就會使用native Serde
  • Hive SerDes:
    • Avro (Hive 0.9.1 and later)
    • ORC (Hive 0.11 and later)
    • RegEx
    • Thrift
    • Parquet (Hive 0.13 and later)
    • CSV (Hive 0.14 and later)
    • MultiDelimitSerDe

3.3、Hive的SerDe案列

1 通過MultiDelimitSerDe 解決多字符分割場景
  • 1、創(chuàng)建表
use myhive;
create  table t1 (id String, name string)
row format serde 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'
WITH SERDEPROPERTIES ("field.delim"="##");
  • 2、準(zhǔn)備數(shù)據(jù) t1.txt
cd /kkb/install/hivedatas
vim t1.txt

1##xiaoming
2##xiaowang
3##xiaozhang
  • 3、加載數(shù)據(jù)
load data local inpath '/kkb/install/hivedatas/t1.txt' into table t1;
  • 4、查詢數(shù)據(jù)
0: jdbc:hive2://node1:10000> select * from t1;
+--------+------------+--+
| t1.id  |  t1.name   |
+--------+------------+--+
| 1      | xiaoming   |
| 2      | xiaowang   |
| 3      | xiaozhang  |
+--------+------------+--+
2 通過RegexSerDe 解決多字符分割場景
  • 1、創(chuàng)建表
create  table t2(id int, name string)
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe' 
WITH SERDEPROPERTIES ("input.regex" = "^(.*)\\#\\#(.*)$");
  • 2、準(zhǔn)備數(shù)據(jù) t1.txt
1##xiaoming
2##xiaowang
3##xiaozhang
  • 3、加載數(shù)據(jù)
load data local inpath '/kkb/install/hivedatas/t1.txt' into table t2;
  • 4、查詢數(shù)據(jù)
0: jdbc:hive2://node1:10000> select * from t2;
+--------+------------+--+
| t2.id  |  t2.name   |
+--------+------------+--+
| 1      | xiaoming   |
| 2      | xiaowang   |
| 3      | xiaozhang  |
+--------+------------+--+

hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES ("input.regex" = "^(.)\#\#(.)$");


- 2、準(zhǔn)備數(shù)據(jù) t1.txt

1##xiaoming
2##xiaowang
3##xiaozhang


- 3、加載數(shù)據(jù)

```sql
load data local inpath '/kkb/install/hivedatas/t1.txt' into table t2;
  • 4、查詢數(shù)據(jù)
0: jdbc:hive2://node1:10000> select * from t2;
+--------+------------+--+
| t2.id  |  t2.name   |
+--------+------------+--+
| 1      | xiaoming   |
| 2      | xiaowang   |
| 3      | xiaozhang  |
+--------+------------+--+

分享名稱:14、Hive壓縮、存儲原理詳解與實戰(zhàn)
路徑分享:http://www.rwnh.cn/article4/gdgeoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站維護、搜索引擎優(yōu)化、網(wǎng)站設(shè)計公司網(wǎng)站設(shè)計、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計
松原市| 灵川县| 霸州市| 招远市| 内江市| 徐州市| 洛阳市| 定西市| 磴口县| 合阳县| 武山县| 合阳县| 蓬莱市| 永和县| 曲阜市| 上思县| 旌德县| 隆化县| 乡宁县| 建平县| 宁国市| 抚顺市| 水城县| 安吉县| 剑川县| 辽源市| 长兴县| 华亭县| 扎赉特旗| 清河县| 萨嘎县| 晋宁县| 威海市| 安阳市| 郧西县| 漠河县| 明水县| 北京市| 芦溪县| 班戈县| 云龙县|