這是CDP中Apache Hive3使用者指南系列之一,之後還有幾篇來介紹Hive3的功能和使用。
Hive Metastore (HMS) 是一種服務,用于在後端 RDBMS(例如 MySQL 或 PostgreSQL)中存儲與 Apache Hive 和其他服務相關的中繼資料。Impala、Spark、Hive 和其他服務共享元存儲。與 HMS 的連接配接包括 HiveServer、Ranger 和代表 HDFS 的 NameNode。
Beeline、Hue、JDBC 和 Impala shell用戶端通過 thrift 或 JDBC 向 HiveServer 送出請求。HiveServer 執行個體向 HMS 讀/寫資料。預設情況下,備援的 HMS 以主動/主動模式運作。實體資料駐留在後端 RDBMS 中,一個用于 HMS的RDBMS。所有的 HMS 執行個體使用相同的後端資料庫。一個單獨的 RDBMS 支援安全服務,例如 Ranger。在任何給定時間,所有連接配接都路由到單一的 RDBMS 服務。HMS 通過thrift與 NameNode 對話,并充當 HDFS 的用戶端。

HMS 直接連接配接到 Ranger 和 NameNode (HDFS),HiveServer 也是如此,但為簡單起見,該圖中并未顯示。後端的一個或多個 HMS 執行個體可以與其他服務(例如 Ranger)通信。
原文連結:
https://docs.cloudera.com/cdp-private-cloud-base/latest/hive-hms-overview/topics/hive-hms-introduction.html1 HMS表的存儲
當您運作 CREATE TABLE 語句或将表遷移到 Cloudera Data Platform 時,您需要了解 HMS 如何存儲 Hive 表。語句的成功或失敗、結果表類型和表位置取決于許多因素。
1.1 HMS 表的轉換
HMS 包含有關您建立的表的以下Hive 中繼資料:
· 表的定義
· 列名
· 資料類型
· 中央的Schema存儲庫中的注釋
當您在 CREATE TABLE 語句中使用 EXTERNAL 關鍵字時,HMS 會将表存儲為外部表。當您省略 EXTERNAL關鍵字并建立托管表或攝取托管表時,HMS 可能會将表轉換為外部表,或者建立表可能會失敗,這具體取決于表的屬性。影響表轉換的一個重要表屬性是 ACID 或非 ACID 表類型:
非ACID
表屬性不包含任何設定為 true 的 ACID 相關屬性。例如,該表不包含這樣的屬性 transactional=true 或 insert_only=true
ACID
表屬性确實包含一個或多個設定為true 的 ACID 屬性。
完全的ACID
表屬性包含 transactional=true 但不包含insert_only=true
僅插入的 ACID
表屬性包含 insert_only=true。
以下矩陣顯示了表類型以及是否支援位置屬性。
托管表 | 位置屬性 | 注釋 | 行動 | |
是的 | 遷移到 CDP,例如從 HDP 或 CDH 叢集。 | 表存儲為外部表 | ||
不 | 表位置為空(null) | 存儲在外部倉庫子目錄中的表* |
*
metastore.warehouse.external.dir
HMS 檢測與 HMS 互動的用戶端類型,例如Hive 或 Spark,并将用戶端的能力與表的需求進行比較。HMS 根據比較結果執行以下操作:
表要求 | 用戶端符合要求 | ACID 表類型 | ||
用戶端可以寫入任何類型的 ACID 表 | 建立表失敗 | |||
用戶端可以寫入完整的 ACID 表 | insert_only=true | |||
用戶端可以寫入僅插入的 ACID 表 |
例如,如果 Spark 用戶端不具備所需的功能,則會出現以下類型的錯誤消息:
Spark has no access to table `mytable`. Clients can access this table only if
they have the following capabilities: CONNECTORREAD,HIVEFULLACIDREAD, HIVEFULLACIDWRITE,
HIVEMANAGESTATS, HIVECACHEINVALIDATE, . . .
2 配置 HMS 以實作高可用性
要在主執行個體出現故障時提供到輔助 Hive Metastore 的故障轉移,您需要知道如何在 Cloudera Manager 中添加 Metastore 角色并配置屬性。
多個 HMS 執行個體以主動/主動模式運作。不發生負載平衡。HMS 用戶端總是命中第一個執行個體,除非它關閉。在這種情況下,用戶端會掃描
hive.metastore.uris
屬性,該屬性
列出HMS 執行個體清單以查找可用于替換的 HMS。如果
hive.metastore.uri.selection
設定為SEQUENTIAL(推薦和預設),則第二個 HMS 是指定替換 ;否則,如果
hive.metastore.uri.selection
設定為RANDOM,則從清單中随機選擇替換 。
最低要求角色: 配置者(也由叢集管理者、完全管理者提供)
1. 在 Cloudera Manager 中,單擊叢集> Hive >配置。
2. 采取以下措施之一:
o 如果您有一個由 Kerberos 保護的叢集,請搜尋 Hive 委托令牌存儲,它指定 Kerberos 令牌的存儲,如下所述。
o 如果您有一個不安全的叢集,請跳過下一步。
3. 選擇
org.apache.hadoop.hive.thrift.DBTokenStore
,然後儲存更改。
Kerberos 委托令牌的存儲由
hive.cluster.delegation.token.store.class
屬性定義。可用的選擇是 Zookeeper、Metastore 和記憶體。Cloudera 建議通過設定org.apache.hadoop.hive.thrift.DBTokenStore 屬性來使用資料庫。
4. 單擊執行個體>操作>添加角色執行個體
5. 在配置設定角色中,在 Metastore 伺服器中,單擊選擇主機。
6. 在 Hosts Selected 中,滾動并選擇要用作備份Metastore 的主機,然後單擊OK。
7. 單擊繼續,直到退出向導。
8. 從“操作”菜單啟動主機上的Metastore 角色。
該
hive.metastore.uris
屬性會自動更新。
9. 要檢查或更改
hive.metastore.uri.selection
屬性,請轉到Clusters > Hive > Configurations,然後搜尋Hive Service Advanced Configuration Snippet (Safety Valve) for hive-site.xml。
10.添加屬性和值(SEQUENTIAL 或 RANDOM)。
3 HWC授權
您配置 Hive 倉庫連接配接器 (HWC) 的方式會影響查詢授權過程和您的安全性。有多種方法可以通過 HWC 通路 Hive,并不是所有操作都通過 HiveServer (HS2)。一些操作,例如 Spark Direct Reader 和 Hive Streaming,通過 HMS 直接進入 Hive,其中通常适用基于存儲的權限。
作為用戶端使用者,您必須在使用HWC 之前使用 kerberos 登入。您需要适當的存儲權限才能寫入目标分區或表位置。您需要配置 HWC 讀取選項。您需要配置 HWC 讀取選項。HWC 讀取配置選項如下表所示:
能力 | JDBC方式 | Spark Direct Reader模式 |
Ranger 與細粒度通路控制的內建 | ✓ | 不适用 |
Hive ACID 讀取 | ||
處理的工作負載 | 非生産的工作負載、小資料集 | 生産工作負載,沒有細粒度通路控制的 ETL |
這些讀取配置選項需要連接配接到不同的Hive 元件:
· Direct Reader 配置:連接配接到 Hive Metastore (HMS)
· JDBC 配置:連接配接到 HiveServer (HS2) 或 HiveServer Interactive (HSI)
Ranger 授權通過 HiveServer (HS2) 或 Hive Metastore API (HMS API) 從 Spark 通路 Hive 表。
要将 ACID 托管表從 Spark 寫入 Hive,您必須使用 HWC。要将外部表從 Spark 寫入 Hive,您可以使用原生 Spark 或 HWC。
下圖展示了典型的讀授權流程:
下圖展示了典型的寫授權流程:
寫入時,HWC 始終通過 HiveServer (HS2) 強制執行授權。在 JDBC 模式下讀取托管表會強制實施 Ranger 授權,包括細粒度功能,例如字段映射。在 Direct Reader 模式下,Ranger 和 HMS 的內建來提供授權。
外部表查詢通過 HMS API,它也與 Ranger 內建。如果您不使用 HWC,則與 Ranger 內建的 Hive 元存儲 (HMS) API 會授權外部表通路。在這種情況下,HMS API-Ranger 內建會強制執行 Ranger Hive ACL。使用 HWC 時,諸如 DROP TABLE 之類的查詢會影響檔案系統資料以及 HMS 中的中繼資料。
使用 Direct Reader 選項,SparkSQL 查詢直接從 HMS 讀取托管表中繼資料,但前提是您有權通路檔案系統上的檔案。您不能使用 Direct Reader 選項寫入托管表。
3.1 托管表授權
Spark 作業在嘗試通路 Apache Hive 托管表時模拟最終使用者。作為最終使用者,您無權通路 Hive 倉庫中的托管檔案。托管表具有不允許最終使用者通路的預設檔案系統權限,包括 Spark 使用者通路。
作為管理者,當您為 JDBC 讀取配置 HWC 時,您可以在 Ranger 中設定通路托管表的權限。您可以微調 Ranger 以保護特定資料。例如,您可以屏蔽某些列中的資料,或設定基于标簽的通路控制。
當您為 Direct Reader 模式配置 HWC 時,您不能以這種方式使用 Ranger。您必須為托管表設定對檔案系統位置的讀取通路權限。您必須對 Hive 倉庫位置 (
hive.metastore.warehouse.dir
)具有讀取和執行權限。
3.2 外表授權
支援外部表讀寫的 Ranger 授權。您需要在 Cloudera Manager 中配置一些屬性來授權外部表寫入。您必須被授予對外部表檔案的檔案系統權限,以允許 Spark 直接通路實際表資料,而不僅僅是表中繼資料。
3.3 Direct Reader授權限制
由于 Spark 允許使用者運作任意代碼,是以 Spark 本身無法實作 Ranger 細粒度通路控制,例如行級過濾或列級屏蔽。此限制擴充到使用 Direct Reader 讀取資料。
要在細粒度級别限制資料通路,請使用支援 Ranger 的讀取選項。如果不需要細粒度通路,請僅考慮使用 Direct Reader 選項從 Spark 讀取 Hive 資料。例如,将 Direct Reader 用于 ETL 用例。
4 授權外部表
作為管理者,您需要了解如何授權使用者對Apache Hive 外部表進行讀寫,包括使用Spark SQL、Hue 和Beeline 通路表。您還需要為使用者配置表的檔案級權限。
您為 HMS API-Ranger內建設定以下屬性和值:
hive.metastore.pre.event.listeners
值:
org.apache.hadoop.hive.ql.security.authorization.plugin.metastore.HiveMetaStoreAuthorizer
配置 HMS 寫入。
hive.security.authenticator.manager
值:
org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator
使用 Cloudera Manager 安全閥将屬性添加到hive-site.xml。
4.1 配置步驟
1. 在 Cloudera Manager 中,要配置Hive Metastore 屬性,請單擊Clusters > Hive-1 > Configuration。
2. 搜尋Hive-site。
3. 在hive-site.xml 的Hive Metastore 伺服器進階配置片段(安全閥)中,單擊+。
4. 添加屬性名稱和值。
5. 重複步驟以添加其他屬性。
6. 儲存更改。
7. 為使用者配置表的檔案級權限。
隻有對外部表具有檔案級權限的使用者才能通路外部表。
5 配置HMS 屬性以進行授權
作為管理者,如果您對查詢授權有任何問題,您可能需要通過 Ranger 設定 Apache Hive Metastore (HMS) 授權。比如你配置了Hive查詢的基于存儲的授權,然後想切換到Ranger授權,就必須設定Ranger授權。您可以配置 HMS 屬性以進行此切換。
要內建 HMS API 和Ranger 以授權查詢,您需要使用 Cloudera Manager 将以下 HMS 屬性和值添加到 hive-site.xml:
org.apache.hadoop.hive.ql.security.authorization. \
plugin.metastore.HiveMetaStoreAuthorizer
值:org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator
使用 Cloudera Manager 安全閥将屬性添加到 hive-site.xml。
5.1 配置步驟
6 配置HMS 屬性以進行授權
價值:
org.apache.hadoop.hive.ql.security.authorization. \
plugin.metastore.HiveMetaStoreAuthorizer
使用 Cloudera Manager 安全閥将屬性添加到 hive-site.xml,如下一節所述。
2. 搜尋蜂巢站點。