**Hive指令實戰操作之中繼資料管理與存儲
提示:本文章内容取自來源: 拉勾教育大資料高薪訓練營
文章目錄
- 前言
- HQL操作之--DQL指令
-
- 第 1 節 Metastore
-
- 1.1 metastore三種配置方式
- 第 2 節 HiveServer2
- 第 3 節 HCatalog
- 第 4 節 資料存儲格式
前言
提示:本文章對于初學者準備,希望對大家有所幫助。如果有什麼建議和疑問,請留言給我,我會不斷完成完善。
HQL操作之–DQL指令
第 1 節 Metastore
Metadata即中繼資料。中繼資料包含用Hive建立的database、table、表的字段等元資訊。中繼資料存儲在關系型資料庫中。如hive内置的Derby、第三方如MySQL等。
Metastore即中繼資料服務,是Hive用來管理庫表中繼資料的一個服務。有了它上層的服務不用再跟裸的檔案資料打交道,而是可以基于結構化的庫表資訊建構計算架構。
通過metastore服務将Hive的中繼資料暴露出去,而不是需要通過對Hive中繼資料庫mysql的通路才能拿到Hive的中繼資料資訊;metastore服務實際上就是一種thrift服
務,通過它使用者可以擷取到Hive中繼資料,并且通過thrift擷取中繼資料的方式,屏蔽了資料庫通路需要驅動,url,使用者名,密碼等細節。
1.1 metastore三種配置方式
1、内嵌模式
内嵌模式使用的是内嵌的Derby資料庫來存儲中繼資料,也不需要額外起Metastore服務。資料庫和Metastore服務都嵌入在主Hive Server程序中。這個是預設的,配置簡單,但是一次隻能一個用戶端連接配接,适用于用來實驗,不适用于生産環境。
優點:配置簡單,解壓hive安裝包 bin/hive 啟動即可使用;
缺點:不同路徑啟動hive,每一個hive擁有一套自己的中繼資料,無法共享。
2、本地模式
本地模式采用外部資料庫來存儲中繼資料,目前支援的資料庫有:MySQL、Postgres、Oracle、MS SQL Server。教學中實際采用的是MySQL。本地模式不需要單獨起metastore服務,用的是跟Hive在同一個程序裡的metastore服務。也就是說當啟動一個hive 服務時,其内部會啟動一個metastore服務。Hive根據 hive.metastore.uris 參數值來判斷,如果為空,則為本地模式。
缺點:每啟動一次hive服務,都内置啟動了一個metastore;在hive-site.xml中暴露的資料庫的連接配接資訊;
優點:配置較簡單,本地模式下hive的配置中指定mysql的相關資訊即可。
3. 遠端模式
遠端模式下,需要單獨起metastore服務,然後每個用戶端都在配置檔案裡配置連接配接到該metastore服務。遠端模式的metastore服務和hive運作在不同的程序裡。在生産環境中,建議用遠端模式來配置Hive Metastore。
在這種模式下,其他依賴hive的軟體都可以通過Metastore通路Hive。此時需要配hive.metastore.uris 參數來指定 metastore 服務運作的機器ip和端口,并且需要單獨手動啟動metastore服務。metastore服務可以配置多個節點上,避免單節點故障導緻整個叢集的hive client不可用。同時hive client配置多metastore位址,會自動選擇可用節點。
metastore内嵌模式配置
1、下載下傳軟體解壓縮
2、設定環境變量,并使之生效
3、初始化資料庫。
schematool -dbType derby -initSchema
4、進入hive指令行
5、再打開一個hive指令行,發現無法進入
metastore遠端模式配置
配置規劃:

配置步驟:
- 将 linux123 的 hive 安裝檔案拷貝到 linux121、linux122
- 在linux121、linux123上分别啟動 metastore 服務
# 啟動 metastore 服務
nohup hive --service metastore &
# 查詢9083端口(metastore服務占用的端口)
lsof -i:9083
# 安裝lsof
yum install lsof
- 修改 linux122 上hive-site.xml。删除配置檔案中:MySQL的配置、連接配接資料庫的使用者名、密碼等資訊;增加連接配接metastore的配置:
1<!-- hive metastore 服務位址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://linux121:9083,thrift://linux123:9083</value>
</property>
- 啟動hive。此時client端無需執行個體化hive的metastore,啟動速度會加快。
分别在linux121、linux121上執行以下指令,檢視連接配接情況
lsof -i:9083
- 高可用測試。關閉已連接配接的metastore服務,發現hive連到另一個節點的服務上,仍然能夠正常使用。
第 2 節 HiveServer2
HiveServer2是一個服務端接口,使遠端用戶端可以執行對Hive的查詢并傳回結果。目前基于Thrift RPC的實作是HiveServer的改進版本,并支援多用戶端并發和身份驗證,啟動hiveServer2服務後,就可以使用jdbc、odbc、thrift 的方式連接配接。
Thrift是一種接口描述語言和二進制通訊協定,它被用來定義和建立跨語言的服務。它被當作一個遠端過程調用(RPC)架構來使用,是由Facebook為“大規模跨語言服務開發”而開發的。
HiveServer2(HS2)是一種允許用戶端對Hive執行查詢的服務。HiveServer2是HiveServer1的後續 版本。HS2支援多用戶端并發和身份驗證,旨在為JDBC、ODBC等開放API用戶端提供更好的支援。
HS2包括基于Thrift的Hive服務(TCP或HTTP)和用于Web UI 的Jetty Web伺服器。
1select * from emp
where sal > 2000;
HiveServer2作用:
為Hive提供了一種允許用戶端遠端通路的服務基于thrift協定,支援跨平台,跨程式設計語言對Hive通路允許遠端通路Hive
HiveServer2配置
配置規劃
配置步驟:
1、修改叢集上的 core-site.xml,增加以下内容:
<!-- HiveServer2 連不上10000;hadoop為安裝使用者 -->
<!-- root使用者可以代理所有主機上的所有使用者 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
2、修改 叢集上的 hdfs-site.xml,增加以下内容:
<!-- HiveServer2 連不上10000;啟用 webhdfs 服務 -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
3、啟動linux123上的 HiveServer2 服務
# 啟動 hiveserver2 服務
nohup hiveserver2 &
# 檢查 hiveserver2 端口
lsof -i:10000
# 從2.0開始,HiveServer2提供了WebUI
# 還可以使用浏覽器檢查hiveserver2的啟動情況。http://linux123:10002/
4、啟動 linux122 節點上的 beeline
Beeline是從 Hive 0.11版本引入的,是 Hive 新的指令行用戶端工具。
Hive用戶端工具後續将使用Beeline 替代 Hive 指令行工具 ,并且後續版本也會廢棄掉 Hive 用戶端工具。
!connect jdbc:hive2://linux123:10000
use mydb;
show tables;
select * from emp;
create table tabtest1 (c1 int, c2 string);
!connect jdbc:mysql://linux123:3306
!help
!quit
第 3 節 HCatalog
HCatalog 提供了一個統一的中繼資料服務,允許不同的工具如 Pig、MapReduce 等通過 HCatalog 直接通路存儲在 HDFS 上的底層檔案。HCatalog是用來通路Metastore的Hive子項目,它的存在給了整個Hadoop生态環境一個統一的定義。
HCatalog 使用了 Hive 的中繼資料存儲,這樣就使得像 MapReduce 這樣的第三方應用可以直接從 Hive 的資料倉庫中讀寫資料。同時,HCatalog 還支援使用者在
MapReduce 程式中隻讀取需要的表分區和字段,而不需要讀取整個表,即提供一種邏輯上的視圖來讀取資料,而不僅僅是從實體檔案的次元。
HCatalog 提供了一個稱為 hcat 的指令行工具。這個工具和 Hive 的指令行工具類似,兩者最大的不同就是 hcat 隻接受不會産生 MapReduce 任務的指令。
# 進入 hcat 所在目錄。$HIVE_HOME/hcatalog/bin
cd $HIVE_HOME/hcatalog/bin
# 執行指令,建立表
./hcat -e "create table default.test1(id string, name string,
age int)"
# 長指令可寫入檔案,使用 -f 選項執行
./hcat -f createtable.txt
# 檢視中繼資料
./hcat -e "use mydb; show tables"
# 檢視表結構
./hcat -e "desc mydb.emp"
# 删除表
./hcat -e "drop table default.test1"
第 4 節 資料存儲格式
Hive支援的存儲數的格式主要有:TEXTFILE(預設格式) 、SEQUENCEFILE、RCFILE、ORCFILE、PARQUET。
- textfile為預設格式,建表時沒有指定檔案格式,則使用TEXTFILE,導入資料時會直接把資料檔案拷貝到hdfs上不進行處理;
- sequencefile,rcfile,orcfile格式的表不能直接從本地檔案導入資料,資料要先導入到textfile格式的表中,然後再從表中用insert導入sequencefile、rcfile、orcfile表中。
行存儲與列存儲
行式存儲下一張表的資料都是放在一起的,但列式存儲下資料被分開儲存了。
行式存儲:
優點:資料被儲存在一起,insert和update更加容易
缺點:選擇(selection)時即使隻涉及某幾列,所有資料也都會被讀取
列式存儲:
優點:查詢時隻有涉及到的列會被讀取,效率高
缺點:選中的列要重新組裝,insert/update比較麻煩
TEXTFILE、SEQUENCEFILE 的存儲格式是基于行存儲的;
ORC和PARQUET 是基于列式存儲的。