1. 概念
MetaSore 是 Hive 中繼資料存儲的地方。Hive 資料庫、表、函數等的定義都存儲在 Metastore 中。根據系統配置方式,統計資訊和授權記錄也可以存儲在此處。Hive 或者其他執行引擎在運作時使用此資料來确定如何解析,授權以及有效執行使用者查詢。
MetaStore 分為兩個部分:服務和背景資料的存儲。
2. 配置參數
這裡隻會展示與 MetaStore 相關的配置參數,與 MetaSote 不相關的配置參數可以在這查閱。
Hive MetaSote 是無狀态的,是以可以有多個執行個體來實作高可用性。使用 hive.metastore.uris 可以指定多個遠端 MetaStore。Hive 将預設使用清單中的第一個,但會在連接配接失敗時随機選擇一個,并嘗試重新連接配接。
3. 部署模式
MetaStore 分為三種部署模式:内嵌模式、本地模式以及遠端模式。
3.1 内嵌MetaStore
預設情況下,MetaStore 服務和 Hive 服務運作在同一個 JVM 中,包含一個内嵌的以本地磁盤作為存儲的 Derby 資料庫執行個體。
使用内嵌的 MetaStore 是 Hive 入門最簡單的方法。但是,每次隻有一個内嵌的 Derby 資料庫可以通路某個磁盤上的資料庫檔案,一次隻能有一個程序可以連接配接到資料庫,是以它并不是一個實際的解決方案,但對于單元測試來說效果很好,并不适合在生産環境使用。
|
3.2 本地MetaStore
如果要支援多會話(以及多租戶),需要使用一個獨立的資料庫。這種配置方式成為本地配置,因為 MetaStore 服務仍然和 Hive 服務運作在同一個程序中,但連接配接的卻是另一個程序中運作的資料庫,在同一台機器上或者遠端機器上。
對于獨立的 MetaStore,MySQL 是一種很受歡迎的選擇。本執行個體我們 MySQL 為例,具體看看如何配置:
|
在本地模式下不需要配置 hive.metastore.uris,預設為空表示是本地模式。
如果選擇 MySQL 作為 MetaStore 存儲資料庫,需要提前将 MySQL 的驅動包拷貝到 $HIVE_HOME/lib目錄下。
JDBC 連接配接驅動類視情況決定選擇 com.mysql.cj.jdbc.Driver 還是 com.mysql.jdbc.Driver。
3.3 遠端MetaStore
在遠端模式下,MetaStore 服務和 Hive 服務運作在不同程序中。CLI、HiveServer2、HCatalog、Impala 以及其他程序使用 Thrift API(使用 hive.metastore.uris 屬性配置)與 MetaStore 服務通信。MetaStore 服務通過 JDBC 與 MetaStore 資料庫進行通信(使用 javax.jdo.option.ConnectionURL 屬性配置):
在這種情況下,我們還可以單獨部署一台 MetaStore 伺服器,以提供更高可用性。這也可以有更好的可管理性/安全性,因為資料庫層可以完全防火牆關閉。用戶端不再需要與每個 Hiver 使用者共享資料庫憑據即可通路元存儲資料庫。
Hive MetaStore 服務端配置:
|
Hive MetaStore用戶端配置:
|
4. 啟動服務
我們可以通過執行以下指令來啟動MetaStore服務:
|
如果我們在 hive-site.xml 配置檔案中指定了 hive.metastore.uris 的 port:
|
我們就可以不指定端口進行啟動:
|
注意用戶端中的端口配置需要和啟動監聽的端口一緻。
參考:AdminManual Metastore Administration