元數(shù)據(jù)管理與存儲(chǔ)

元數(shù)據(jù)管理與存儲(chǔ)

在Hive的具體使用中,首先面臨的問題便是如何定義表結(jié)構(gòu)信息,跟結(jié)構(gòu)化的數(shù)據(jù) 映射成功。所謂的映射指的是一種對(duì)應(yīng)關(guān)系。在Hive中需要描述清楚表跟文件之間 的映射關(guān)系、列和字段之間的關(guān)系等等信息。這些描述映射關(guān)系的數(shù)據(jù)的稱之為 Hive的元數(shù)據(jù)。該數(shù)據(jù)十分重要,因?yàn)橹挥型ㄟ^查詢它才可以確定用戶編寫sql和最 終操作文件之間的關(guān)系。

Metastore

Metadata即元數(shù)據(jù)。元數(shù)據(jù)包含用Hive創(chuàng)建的database、table、表的字段等元信 息。元數(shù)據(jù)存儲(chǔ)在關(guān)系型數(shù)據(jù)庫中。如hive內(nèi)置的Derby、第三方如MySQL等。

Metastore即元數(shù)據(jù)服務(wù),是Hive用來管理庫表元數(shù)據(jù)的一個(gè)服務(wù)。有了它上層的 服務(wù)不用再跟裸的文件數(shù)據(jù)打交道,而是可以基于結(jié)構(gòu)化的庫表信息構(gòu)建計(jì)算框 架。

通過metastore服務(wù)將Hive的元數(shù)據(jù)暴露出去,而不是需要通過對(duì)Hive元數(shù)據(jù)庫 mysql的訪問才能拿到Hive的元數(shù)據(jù)信息;metastore服務(wù)實(shí)際上就是一種thrift服務(wù)(跨語言的),通過它用戶可以獲取到Hive元數(shù)據(jù),并且通過thrift獲取元數(shù)據(jù)的方式,屏蔽了 數(shù)據(jù)庫訪問需要驅(qū)動(dòng),url,用戶名,密碼等細(xì)節(jié)。

metastore三種配置方式

內(nèi)嵌模式(默認(rèn)方式)

內(nèi)嵌模式使用的是內(nèi)嵌的Derby數(shù)據(jù)庫來存儲(chǔ)元數(shù)據(jù),也不需要額外起Metastore服 務(wù)。數(shù)據(jù)庫和Metastore服務(wù)都嵌入在主Hive Server進(jìn)程中。這個(gè)是默認(rèn)的,配置簡(jiǎn)單,但是一次只能一個(gè)客戶端連接,適用于用來實(shí)驗(yàn),不適用于生產(chǎn)環(huán)境。

優(yōu)點(diǎn):配置簡(jiǎn)單,解壓hive安裝包 bin/hive 啟動(dòng)即可使用;

缺點(diǎn):不同路徑啟動(dòng)hive,每一個(gè)hive擁有一套自己的元數(shù)據(jù),無法共享。

內(nèi)嵌模式.png

本地方式

本地模式采用外部數(shù)據(jù)庫來存儲(chǔ)元數(shù)據(jù),目前支持的數(shù)據(jù)庫有:MySQL、

Postgres、Oracle、MS SQL Server。教學(xué)中實(shí)際采用的是MySQL。

本地模式不需要單獨(dú)起metastore服務(wù),用的是跟Hive在同一個(gè)進(jìn)程里的metastore 服務(wù)。也就是說當(dāng)啟動(dòng)一個(gè)hive 服務(wù)時(shí),其內(nèi)部會(huì)啟動(dòng)一個(gè)metastore服務(wù)。Hive 根據(jù) hive.metastore.uris 參數(shù)值來判斷,如果為空,則為本地模式。

缺點(diǎn):每啟動(dòng)一次hive服務(wù),都內(nèi)置啟動(dòng)了一個(gè)metastore;在hive-site.xml中暴露的數(shù)據(jù)庫的連接信息;一旦數(shù)據(jù)連接如密碼等信息發(fā)送編號(hào),配置文件都有修改

優(yōu)點(diǎn):配置較簡(jiǎn)單,本地模式下hive的配置中指定mysql的相關(guān)信息即可。

本地模式.png

遠(yuǎn)程模式

遠(yuǎn)程模式下,需要單獨(dú)起metastore服務(wù),然后每個(gè)客戶端都在配置文件里配置連接 到該metastore服務(wù)。遠(yuǎn)程模式的metastore服務(wù)和hive運(yùn)行在不同的進(jìn)程里。在生產(chǎn)環(huán)境中,建議用遠(yuǎn)程模式來配置Hive Metastore。

在這種模式下,其他依賴hive的軟件都可以通過Metastore訪問Hive。此時(shí)需要配置 hive.metastore.uris 參數(shù)來指定 metastore 服務(wù)運(yùn)行的機(jī)器ip和端口,并且需要單 獨(dú)手動(dòng)啟動(dòng)metastore服務(wù)。metastore服務(wù)可以配置多個(gè)節(jié)點(diǎn)上,避免單節(jié)點(diǎn)故障 導(dǎo)致整個(gè)集群的hive client不可用。同時(shí)hive client配置多個(gè)metastore地址,會(huì)自 動(dòng)選擇可用節(jié)點(diǎn)。

遠(yuǎn)程模式.png

metastore內(nèi)嵌模式配置

  1. 下載軟件解壓縮
  2. 設(shè)置環(huán)境變量,并使之生效
  3. 初始化數(shù)據(jù)庫。
    schematool -dbType derby -initSchema
  4. 進(jìn)入hive命令行
  5. 再打開一個(gè)hive命令行,發(fā)現(xiàn)無法進(jìn)入

metastore遠(yuǎn)程模式配置

metastore遠(yuǎn)程模式配置

配置步驟:

  1. 將 linux123 的 hive 安裝文件拷貝到 linux121、linux122 ,
yum install -y lsof
  1. 在linux121、linux123上分別啟動(dòng) metastore 服務(wù)
# 啟動(dòng) metastore 服務(wù)
nohup hive --service metastore &
# 查詢9083端口(metastore服務(wù)占用的端口) 
lsof -i:9083
# 安裝lsof
yum install lsof
  1. 修改 linux122 上hive-site.xml。刪除配置文件中:MySQL的配置、連接數(shù)據(jù)庫 的用戶名、口令等信息;增加連接metastore的配置:
<!-- hive metastore 服務(wù)地址 --> 
<property>
  <name>hive.metastore.uris</name>
  <value>thrift://linux121:9083,thrift://linux123:9083</value>
</property>
  1. 啟動(dòng)hive。此時(shí)client端無需實(shí)例化hive的metastore,啟動(dòng)速度會(huì)加快。
# 分別在linux121、linux121上執(zhí)行以下命令,查看連接情況 
lsof -i:9083
  1. 高可用測(cè)試。關(guān)閉已連接的metastore服務(wù),發(fā)現(xiàn)hive連到另一個(gè)節(jié)點(diǎn)的服務(wù) 上,仍然能夠正常使用。

HiveServer2

HiveServer2是一個(gè)服務(wù)端接口,使遠(yuǎn)程客戶端可以執(zhí)行對(duì)Hive的查詢并返回結(jié)果。 目前基于Thrift RPC的實(shí)現(xiàn)是HiveServer的改進(jìn)版本,并支持多客戶端并發(fā)和身份驗(yàn) 證,啟動(dòng)hiveServer2服務(wù)后,就可以使用jdbc、odbc、thrift 的方式連接。

Thrift是一種接口描述語言和二進(jìn)制通訊協(xié)議,它被用來定義和創(chuàng)建跨語言的服務(wù)。 它被當(dāng)作一個(gè)遠(yuǎn)程過程調(diào)用(RPC)框架來使用,是由Facebook為“大規(guī)模跨語言服務(wù)開發(fā)”而開發(fā)的。

HiveServer2.png

HiveServer2(HS2)是一種允許客戶端對(duì)Hive執(zhí)行查詢的服務(wù)。HiveServer2是 HiveServer1的后續(xù) 版本。HS2支持多客戶端并發(fā)和身份驗(yàn)證,旨在為JDBC、ODBC 等開放API客戶端提供更好的支持。

HS2包括基于Thrift的Hive服務(wù)(TCP或HTTP)和用于Web UI 的Jetty Web服務(wù)器。

HiveServer2作用:

  • 為hive 提供一種允許客戶端遠(yuǎn)程訪問的服務(wù)
  • 基于thirft協(xié)議,支持跨平臺(tái)、跨編程語言對(duì)Hive訪問
  • 允許遠(yuǎn)程訪問hive

HiveServer2配置

image.png
配置步驟
  1. 修改集群core-site.xml,增加一下內(nèi)容
<!-- HiveServer2 連不上10000;hadoop為安裝用戶 --> 
<!-- root用戶可以代理所有主機(jī)上的所有用戶 -->
<property>
  <name>hadoop.proxyuser.root.hosts</name>
  <value>*</value>
</property>
<property>
  <name>hadoop.proxyuser.root.groups</name>
  <value>*</value>
</property>
  1. 修改集群上hdfs-site.xml
<!-- HiveServer2 連不上10000;啟用 webhdfs 服務(wù) -->
<property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
</property>

分發(fā)到其他節(jié)點(diǎn),重新啟動(dòng)HDFS

  1. 啟動(dòng)linux123上的 HiveServer2 服務(wù)
# 啟動(dòng) hiveserver2 服務(wù) 
nohup hiveserver2 &
# 檢查 hiveserver2 端口 
lsof -i:10000
# 從2.0開始,HiveServer2提供了WebUI
# 還可以使用瀏覽器檢查hiveserver2的啟動(dòng)情況。http://linux123:10002/

4、啟動(dòng) linux122 節(jié)點(diǎn)上的 beeline

Beeline是從 Hive 0.11版本引入的,是 Hive 新的命令行客戶端工具。 Hive客戶端工具后續(xù)將使用Beeline 替代 Hive 命令行工具 ,并且后續(xù)版本也會(huì)廢棄

掉 Hive 客戶端工具。

cd $HIVE_HOME/bin/
./beeline
! connect jdbc:hive2://linux123:10000
use mydb;
show tables;
select * from emp;
create table tabtest1 (c1 int, c2 string);

HCataLog

HCatalog 提供了一個(gè)統(tǒng)一的元數(shù)據(jù)服務(wù),允許不同的工具如 Pig、MapReduce 等 通過 HCatalog 直接訪問存儲(chǔ)在 HDFS 上的底層文件。HCatalog是用來訪問 Metastore的Hive子項(xiàng)目,它的存在給了整個(gè)Hadoop生態(tài)環(huán)境一個(gè)統(tǒng)一的定義。

HCatalog 使用了 Hive 的元數(shù)據(jù)存儲(chǔ),這樣就使得像 MapReduce 這樣的第三方應(yīng) 用可以直接從 Hive 的數(shù)據(jù)倉庫中讀寫數(shù)據(jù)。同時(shí),HCatalog 還支持用戶在 MapReduce 程序中只讀取需要的表分區(qū)和字段,而不需要讀取整個(gè)表,即提供一種 邏輯上的視圖來讀取數(shù)據(jù),而不僅僅是從物理文件的維度。

HCatalog 提供了一個(gè)稱為 hcat 的命令行工具。這個(gè)工具和 Hive 的命令行工具類 似,兩者最大的不同就是 hcat 只接受不會(huì)產(chǎn)生 MapReduce 任務(wù)的命令。

# 進(jìn)入 hcat 所在目錄。$HIVE_HOME/hcatalog/bin 
cd $HIVE_HOME/hcatalog/bin
# 執(zhí)行命令,創(chuàng)建表
./hcat -e "create table default.test1(id string, name string, age int)"
# 長(zhǎng)命令可寫入文件,使用 -f 選項(xiàng)執(zhí)行 
./hcat -f createtable.txt
# 查看元數(shù)據(jù)
./hcat -e "use mydb; show tables"
# 查看表結(jié)構(gòu)
./hcat -e "desc mydb.emp"
# 刪除表
./hcat -e "drop table default.test1"

數(shù)據(jù)存儲(chǔ)格式

Hive支持存儲(chǔ)格式主要有:

  • Textfile(默認(rèn)模式),導(dǎo)入數(shù)據(jù)時(shí),可以直接將數(shù)據(jù)拷貝到hdfs上
  • SEQUENCEFILE、RCFILE、ORCFILE、PARQUET不能直接從文件系統(tǒng)導(dǎo)入數(shù)據(jù),通常先導(dǎo)入textfile表中,然后執(zhí)行insert...select...操作,在導(dǎo)出Textfile

行存儲(chǔ)與列存儲(chǔ)

行式存儲(chǔ)下,一張表的數(shù)據(jù)都是放在一起的,但列存儲(chǔ)下,數(shù)據(jù)被分開保存了。

行式存儲(chǔ)

優(yōu)點(diǎn):一行數(shù)據(jù)被保存在一起,insert與update更容易

缺點(diǎn):查詢時(shí),即使涉及幾列,所有的數(shù)據(jù)都會(huì)被讀取

列式存儲(chǔ)

優(yōu)點(diǎn):查詢的時(shí)候只有設(shè)計(jì)的列會(huì)被讀取,效率高

缺點(diǎn):選中的列要重新組裝,insert/update比較麻煩

textfile、sequencefile 的存儲(chǔ)格式是行存儲(chǔ)

rcfile、ocr、parquet 式列存儲(chǔ)

行存儲(chǔ)與列存儲(chǔ).png

TextFile

默認(rèn)的存儲(chǔ)格式,數(shù)據(jù)不做壓縮,磁盤開銷大,數(shù)據(jù)解析開銷大,可結(jié)合Gzip、Bzip2使用(系統(tǒng)自動(dòng)檢查,執(zhí)行查詢時(shí)自動(dòng)解壓),但是這種方式,hive不會(huì)對(duì)數(shù)據(jù)進(jìn)行切分,從而無法對(duì)數(shù)據(jù)進(jìn)行并行操作。

create table if not exists uaction_text(
  userid string,
  itemid string,
  behaviortype int,
  geohash string,
  itemcategory string,
  time string)
row format delimited fields terminated by ','
stored as textfile;
load data local inpath '/mnt/hadoop/data/uaction.dat' overwrite into table uaction_text;

SEQUENCEFILE(使用較少)

Sequence file 是Hadoop API提供的一種二進(jìn)制文件行存儲(chǔ),具有使用方便、可分割、可壓縮的特點(diǎn)。

支持的壓縮方式:

  • none
  • record
  • block

備注:Record一般壓縮效率比較低,一般建議使用BLOCK方式壓縮

RCFile(使用方式也比較少)

RCFile(Record Columnar File),列式記錄文件,是一種類似sequenceFile 的鍵值對(duì)數(shù)據(jù)文件,結(jié)合了列存儲(chǔ)和行存儲(chǔ)的優(yōu)缺點(diǎn),是基于行列行列混合存儲(chǔ)的RCFile

RCFile遵循的先水平劃分,在垂直劃分的設(shè)計(jì)理念,先將數(shù)據(jù)按行水平劃分為行組,這樣一行數(shù)據(jù)保證存儲(chǔ)在同一個(gè)集群節(jié)點(diǎn),然后在行進(jìn)行垂直劃分。

RCFile.png

  • 一個(gè)表包含多個(gè)HDFS
  • 一個(gè)HDFS的Block包含多個(gè)行組(row group)
  • 行組由三個(gè)部分組成
    • 第一個(gè)部分是一個(gè)16字節(jié)的分隔符,用來做兩個(gè)不同行組的分割符。
    • 第二個(gè)部分是當(dāng)前行組的元數(shù)據(jù)信息
    • 第三部分才是數(shù)據(jù)存儲(chǔ)區(qū),以列為單位,存儲(chǔ)真實(shí)數(shù)據(jù)。

ORCFile

全名:Optimized Row Columnar (ORC) file,其實(shí)就是對(duì)RCFile做了一些優(yōu)化。運(yùn)用ORCFile可以提高Hive的讀、寫以及處理數(shù)據(jù)的性能。

ORCFile由三個(gè)部分組成:

  • Postscript: 壓縮參數(shù)和壓縮大小相關(guān)信息。
  • file footer: 文件腳注,包含文件中的stripe(條帶)的列表、每個(gè)stripe行數(shù),以及每個(gè)列的數(shù)據(jù)類型,還包括每個(gè)列的最大、最小、行計(jì)數(shù)、求和等信息。
  • strpe:條帶,orc文件存儲(chǔ)數(shù)據(jù)的地方,默認(rèn)請(qǐng)求,一個(gè)條帶250M;
    • index data:一個(gè)輕量級(jí)的index,默認(rèn)是每隔1W行做一個(gè)索引,包括該條帶的一些統(tǒng)計(jì)信息,以及數(shù)據(jù)在條帶的位置索引信息。
    • row data:存放實(shí)際的數(shù)據(jù),先做水平分割,在做垂直分割,以列為單位存儲(chǔ)數(shù)據(jù)。
    • stripe footer:存放條帶的元數(shù)據(jù)信息
ORCFile.png

ORC在每個(gè)文件提供三個(gè)級(jí)別索引:文件索引、條帶索引、行組級(jí)索引,借助ORC提供給的索引,能加速數(shù)據(jù)查找和讀取效率,避免大部分不滿足條件的查詢,也可以避免磁盤和網(wǎng)絡(luò)IO的浪費(fèi),提高效率。提升整個(gè)集群的工作負(fù)載。

事務(wù)表必須使用ORC格式。

create table if not exists uaction_orc(
  userid string,
  itemid string,
  behaviortype int,
  geohash string,
  itemcategory string,
  time string)
stored as orc;

insert overwrite table uaction_orc select * from uaction_text;

Parquet

Apache Parquet 是 Hadoop生態(tài)圈中一種新型列式存儲(chǔ)的格式,他可以兼容Hadoop生態(tài)圈中大多數(shù)計(jì)算框架。被多種查詢語言引擎支持,與語言和平臺(tái)無關(guān)。

Parquet文件是以二進(jìn)制方式存儲(chǔ)的,不能直接讀取的。文件中包括實(shí)際數(shù)據(jù)和元數(shù)據(jù),parquet格式文件是自解析的。

parquet.png

一個(gè)文件由多個(gè)行組和元數(shù)據(jù)(Footer)組成

行組:

  • 寫入數(shù)據(jù)的時(shí)候,一個(gè)行組是最大的緩存單元
  • MR任務(wù)處理的最小并發(fā)單元,一個(gè)MR至少處理一個(gè)行組
  • 一般大小在50M-1G之間??梢栽O(shè)置

一個(gè)行組包含多個(gè)Column Chunk,

Column Chunk:

  • 存儲(chǔ)當(dāng)前行組內(nèi)的某一列數(shù)據(jù)。
  • 最小的IO并發(fā)單元,一個(gè)CPU一次讀取一個(gè)Column Chunk

一個(gè)Column Chunk 可以多有page

page:

  • 壓縮、讀取數(shù)據(jù)的最小單元
  • 獲取單條數(shù)據(jù)的最小讀取單元
  • 大小在8K-1M之間,越大壓縮率越高。

Footer:

數(shù)據(jù)的schema信息,

每個(gè)行組的元數(shù)據(jù)信息:偏移量、大小。

每個(gè)column Chunk 的元數(shù)據(jù)信息:列的編碼格式、偏移量、大小、數(shù)據(jù)量的等信息。

create table if not exists uaction_parquet(
  userid string,
  itemid string,
  behaviortype int,
  geohash string,
  itemcategory string,
  time string)
stored as parquet;
insert overwrite table uaction_parquet select * from uaction_text;

文件存儲(chǔ)格式對(duì)比測(cè)試

ORC/Parquet/TextFile

說明:
1、給 linux123 分配合適的資源。2core;2048G內(nèi)存

2、適當(dāng)減小文件的數(shù)據(jù)量(現(xiàn)有數(shù)據(jù)約800W,根據(jù)自己的實(shí)際選擇處理100- 300W條數(shù)據(jù)均可)

# 檢查文件行數(shù)
wc -l uaction.dat
#
head -n 1000000 uaction.dat > uaction1.dat 
tail -n 1000000 uaction.dat > uaction2.dat

文件壓縮比

hive (mydb)> dfs -ls /user/hive/warehouse/mydb.db/ua*;
13517070 /user/hive/warehouse/mydb.db/uaction_orc/000000_1000 
34867539 /user/hive/warehouse/mydb.db/uaction_parquet/000000_1000 
90019734 /user/hive/warehouse/mydb.db/uaction_text/useraction.dat

ORC > Parquet > text

執(zhí)行查詢

SELECT COUNT(*) FROM uaction_text;
SELECT COUNT(*) FROM uaction_orc;
SELECT COUNT(*) FROM uaction_parquet;
-- text : 14.446 
-- orc: 0.15
-- parquet : 0.146

orc 與 parquet類似 > txt

在生產(chǎn)環(huán)境中,Hive表的數(shù)據(jù)格式使用最多的有三種:TextFile、ORCFile、Parquet。

  • TextFile文件更多的是作為跳板來使用(即方便將數(shù)據(jù)轉(zhuǎn)為其他格式)
  • 有update、delete和事務(wù)性操作的需求,通常選擇ORCFile
  • 沒有事務(wù)性要求,希望支持Impala、Spark,建議選擇Parquet
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容