在 Azure HDInsight 上將 Apache Spark 和 Apache Hive 與 Hive Warehouse Connector 整合起來
Apache Hive Warehouse 連線 or (HWC) 是一個連結庫,可讓您更輕鬆地使用 Apache Spark 和 Apache Hive。 它支援在Spark DataFrame和Hive資料表之間行動資料等工作。 此外,將Spark串流數據導向Hive數據表。 Hive Warehouse 連線 or 的運作方式就像 Spark 與 Hive 之間的橋樑一樣。 它也支援 Scala、Java 和 Python 作為開發的程式設計語言。
Hive Warehouse 連線 or 可讓您利用 Hive 和 Spark 的獨特功能來建置功能強大的巨量數據應用程式。
Apache Hive 支援不可部分完成、一致、隔離和持久性 (ACID) 的資料庫交易。 如需Hive中ACID和交易的詳細資訊,請參閱 Hive交易。 Hive 也透過 Apache Ranger 和 Apache Spark 中無法使用的低延遲分析處理 (LLAP) 提供詳細的安全性控制。
Apache Spark 具有結構化串流 API,可提供 Apache Hive 中無法使用的串流功能。 從 HDInsight 4.0 開始,Apache Spark 2.3.1 和更新版本,而 Apache Hive 3.1.0 有個別的中繼存放區目錄,這使得互操作性變得困難。
Hive 倉儲 連線 or (HWC) 可讓您更輕鬆地一起使用 Spark 和 Hive。 HWC 連結庫會以平行的方式將數據從 LLAP 精靈載入 Spark 執行程式。 此程式比從 Spark 到 Hive 的標準 JDBC 連線更有效率且可調整。 這為 HWC 帶來了兩種不同的執行模式:
- 透過HiveServer2的Hive JDBC模式
- 使用 LLAP 精靈 的 Hive LLAP 模式 [建議]
根據預設,HWC 會設定為使用Hive LLAP精靈。 如需使用上述模式搭配其各自的 API 執行 Hive 查詢(讀取和寫入),請參閱 HWC API。
Hive Warehouse Connector 所支援的部分作業包括:
- 描述資料表
- 建立 ORC 格式數據的數據表
- 選取 Hive 資料並擷取資料架構
- 將資料架構批次寫入至 Hive
- 執行 Hive 更新陳述式
- 從 Hive 讀取資料表資料、在 Spark 中轉換它,並將它寫入至新的 Hive 資料表
- 使用 HiveStreaming 將資料架構或 Spark 串流寫入至 Hive
Hive Warehouse 連線 or 設定
重要
- 不支援在 Spark 2.4 企業安全性套件叢集上安裝的 HiveServer2 互動式實例搭配 Hive Warehouse 連線 or 使用。 相反地,您必須設定個別的HiveServer2互動式叢集來裝載HiveServer2互動式工作負載。 不支援使用單一 Spark 2.4 叢集的 Hive Warehouse 連線 or 設定。
- 不支援Hive Warehouse 連線 or (HWC) 連結庫與已啟用工作負載管理 (WLM) 功能的互動式查詢叢集搭配使用。
在只有 Spark 工作負載且想要使用 HWC 連結庫的案例中,請確定互動式查詢叢集未啟用工作負載管理功能(hive.server2.tez.interactive.queue
未在 Hive 設定中設定組態)。
針對 Spark 工作負載 (HWC) 和 LLAP 原生工作負載都存在的情況,您必須建立兩個具有共用中繼存放區資料庫的個別互動式查詢叢集。 原生 LLAP 工作負載的一個叢集,其中 WLM 功能可以視需要啟用,而 HWC 的叢集則僅限 WLM 功能不應該設定的工作負載。 請務必注意,即使只有一個叢集中啟用 WLM 資源計劃,您也可以從這兩個叢集檢視 WLM 資源計劃。 請勿對停用WLM功能之叢集中的資源計劃進行任何變更,因為這可能會影響其他叢集中的WLM功能。 - 雖然 Spark 支援 R 運算語言來簡化其數據分析,但不支援搭配 R 使用 Hive Warehouse 連線 or (HWC) 連結庫。若要執行 HWC 工作負載,您可以使用僅支援 Scala、Java 和 Python 的 JDBC 樣式 HiveWarehouseSession API,執行從 Spark 到 Hive 的查詢。
- 數位/結構/對應類型等複雜數據類型不支援透過HiveServer2透過 JDBC 模式執行查詢(讀取和寫入)。
- HWC 僅支援以 ORC 檔案格式撰寫。 非 ORC 寫入(例如:parquet 和文字檔案格式)不支援透過 HWC。
Hive Warehouse 連線 or 需要 Spark 和互動式查詢工作負載的個別叢集。 請遵循下列步驟,在 Azure HDInsight 中設定這些叢集。
支援的叢集類型與版本
HWC 版本 | Spark 版本 | InteractiveQuery 版本 |
---|---|---|
v1 | Spark 2.4 |HDI 4.0 | 互動式查詢 3.1 |HDI 4.0 |
v2 | Spark 3.1 |HDI 5.0 | 互動式查詢 3.1 |HDI 5.0 |
建立叢集
使用記憶體帳戶和自定義 Azure 虛擬網路建立 HDInsight Spark 4.0 叢集。 如需在 Azure 虛擬網路中建立叢集的資訊,請參閱 將 HDInsight 新增至現有的虛擬網路。
使用與Spark叢集相同的記憶體帳戶和 Azure 虛擬網路,建立 HDInsight 互動式查詢 (LLAP) 4.0 叢集。
設定 HWC 設定
收集初步資訊
從網頁瀏覽器,流覽至
https://LLAPCLUSTERNAME.azurehdinsight.net/#/main/services/HIVE
LLAPCLUSTERNAME 是您互動式查詢叢集的名稱。流覽至 [摘要>HiveServer2 互動式 JDBC URL],並記下此值。 值可能類似:
jdbc:hive2://<zookeepername1>.rekufuk2y2ce.bx.internal.cloudapp.net:2181,<zookeepername2>.rekufuk2y2ce.bx.internal.cloudapp.net:2181,<zookeepername3>.rekufuk2y2ce.bx.internal.cloudapp.net:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2-interactive
。流覽至 [設定>進階進階>hive-site>hive.zookeeper.quorum],並記下此值。 值可能類似:
<zookeepername1>.rekufuk2y2cezcbowjkbwfnyvd.bx.internal.cloudapp.net:2181,<zookeepername2>.rekufuk2y2cezcbowjkbwfnyvd.bx.internal.cloudapp.net:2181,<zookeepername3>.rekufuk2y2cezcbowjkbwfnyvd.bx.internal.cloudapp.net:2181
。流覽至 [Configs>進階>一般>hive.metastore.uris],並記下值。 值可能類似:
thrift://iqgiro.rekufuk2y2cezcbowjkbwfnyvd.bx.internal.cloudapp.net:9083,thrift://hn*.rekufuk2y2cezcbowjkbwfnyvd.bx.internal.cloudapp.net:9083
。流覽至 [設定>進階進階>hive-interactive-site>hive.llap.daemon.service.hosts ],並記下此值。 值可能類似:
@llap0
。
設定 Spark 叢集設定
從網頁瀏覽器,流覽至
https://CLUSTERNAME.azurehdinsight.net/#/main/services/SPARK2/configs
CLUSTERNAME是您Apache Spark 叢集的名稱。展開 [自定義 spark2- 預設值]。
選取 [新增屬性... ] 以新增下列組態:
組態 值 spark.datasource.hive.warehouse.load.staging.dir
如果您使用 ADLS Gen2 儲存體 帳戶,請使用 abfss://STORAGE_CONTAINER_NAME@STORAGE_ACCOUNT_NAME.dfs.core.windows.net/tmp
如果您使用 Azure Blob 儲存體 帳戶,請使用wasbs://STORAGE_CONTAINER_NAME@STORAGE_ACCOUNT_NAME.blob.core.windows.net/tmp
。
設定為適當的 HDFS 相容預備目錄。 如果您有兩個不同的叢集,暫存目錄應該是 LLAP 叢集記憶體帳戶暫存目錄中的資料夾,以便 HiveServer2 可以存取它。STORAGE_ACCOUNT_NAME
取代為叢集使用的記憶體帳戶名稱,並以STORAGE_CONTAINER_NAME
記憶體容器的名稱取代 。spark.sql.hive.hiveserver2.jdbc.url
您稍早從 HiveServer2互動式 JDBC URL 取得的值 spark.datasource.hive.warehouse.metastoreUri
您稍早從 hive.metastore.uris取得的值。 spark.security.credentials.hiveserver2.enabled
true
適用於 YARN 叢集模式和false
YARN 用戶端模式。spark.hadoop.hive.zookeeper.quorum
您稍早從 hive.zookeeper.quorum取得的值。 spark.hadoop.hive.llap.daemon.service.hosts
您稍早從 hive.llap.daemon.service.hosts取得的值。 儲存變更並重新啟動所有受影響的元件。
設定適用於企業安全性套件的 HWC (ESP) 叢集
企業安全性套件 (ESP) 提供企業級功能,例如 Active Directory 型驗證、多用戶支援,以及 Azure HDInsight 中 Apache Hadoop 叢集的角色型存取控制。 如需 ESP 的詳細資訊,請參閱 在 HDInsight 中使用企業安全性套件。
除了上一節所述的組態之外,新增下列組態以在 ESP 叢集上使用 HWC。
從 Spark 叢集的 Ambari Web UI,流覽至 Spark2>CONFIGS> 自定義 spark2 預設值。
更新下列屬性。
組態 值 spark.sql.hive.hiveserver2.jdbc.url.principal
hive/<llap-headnode>@<AAD-Domain>
從網頁瀏覽器,流覽至
https://CLUSTERNAME.azurehdinsight.net/#/main/services/HIVE/summary
CLUSTERNAME是您互動式查詢叢集的名稱。 按兩下 [ HiveServer2 Interactive]。 您會看到 LLAP 執行所在的前端節點的完整功能變數名稱 (FQDN),如螢幕快照所示。 將取代<llap-headnode>
為此值。使用 ssh 命令 連線到您的互動式查詢叢集。 在檔案中
/etc/krb5.conf
尋找default_realm
參數。 將 取代<AAD-DOMAIN>
為此值作為大寫字串,否則找不到認證。例如
hive/hn*.mjry42ikpruuxgs2qy2kpg4q5e.cx.internal.cloudapp.net@PKRSRVUQVMAE6J85.D2.INTERNAL.CLOUDAPP.NET
。
視需要儲存變更並重新啟動元件。
Hive 倉儲 連線 或使用量
您可以選擇幾個不同的方法來連線到互動式查詢叢集,並使用Hive Warehouse 連線 or 執行查詢。 支援的方法包括下列工具:
以下是從 Spark 連線到 HWC 的一些範例。
Spark 殼層
這是透過已修改的 Scala 殼層版本以互動方式執行 Spark 的方式。
使用 ssh 命令來連線到 Apache Spark 叢集。 編輯以下命令並將 CLUSTERNAME 取代為您叢集的名稱,然後輸入命令:
ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
從 ssh 工作階段執行下列命令,以記下
hive-warehouse-connector-assembly
版本:ls /usr/hdp/current/hive_warehouse_connector
使用上面所識別的
hive-warehouse-connector-assembly
版本來編輯下列程式碼。 然後執行命令以啟動 Spark 殼層:spark-shell --master yarn \ --jars /usr/hdp/current/hive_warehouse_connector/hive-warehouse-connector-assembly-<VERSION>.jar \ --conf spark.security.credentials.hiveserver2.enabled=false
啟動 Spark 殼層之後,可以使用下列命令啟動 Hive Warehouse 連線 or 實例:
import com.hortonworks.hwc.HiveWarehouseSession val hive = HiveWarehouseSession.session(spark).build()
Spark-submit
Spark-submit 是一個公用程式,可將任何Spark程式(或作業)提交至Spark叢集。
spark-submit 作業會依照我們的指示設定 Spark 和 Hive Warehouse 連線 or,執行我們傳遞給它的程式,然後清除釋放正在使用的資源。
一旦您將 scala/java 程式代碼與相依性建置到元件 jar 中之後,請使用下列命令來啟動 Spark 應用程式。 將和 <APP_JAR_PATH>
取代<VERSION>
為實際值。
YARN 用戶端模式
spark-submit \ --class myHwcApp \ --master yarn \ --deploy-mode client \ --jars /usr/hdp/current/hive_warehouse_connector/hive-warehouse-connector-assembly-<VERSION>.jar \ --conf spark.security.credentials.hiveserver2.enabled=false /<APP_JAR_PATH>/myHwcAppProject.jar
YARN 叢集模式
spark-submit \ --class myHwcApp \ --master yarn \ --deploy-mode cluster \ --jars /usr/hdp/current/hive_warehouse_connector/hive-warehouse-connector-assembly-<VERSION>.jar \ --conf spark.security.credentials.hiveserver2.enabled=true /<APP_JAR_PATH>/myHwcAppProject.jar
當我們在 pySpark 中撰寫整個應用程式並封裝成 .py
檔案時,也會使用此公用程式,以便將整個程式碼提交至 Spark 叢集以執行。
針對 Python 應用程式,將.py檔案傳遞至 /<APP_JAR_PATH>/myHwcAppProject.jar
,並使用 將下列組態 (Python .zip) 檔案新增至搜尋路徑 --py-files
。
--py-files /usr/hdp/current/hive_warehouse_connector/pyspark_hwc-<VERSION>.zip
在企業安全性套件 (ESP) 叢集上執行查詢
啟動 spark-shell 或 spark-submit 之前,請先使用 kinit
。 將 USERNAME 取代為具有存取叢集許可權的網域帳戶名稱,然後執行下列命令:
kinit USERNAME
保護 Spark ESP 叢集上的數據
輸入下列命令,以建立含有一些範例數據的數據表
demo
:create table demo (name string); INSERT INTO demo VALUES ('HDinsight'); INSERT INTO demo VALUES ('Microsoft'); INSERT INTO demo VALUES ('InteractiveQuery');
使用下列命令檢視數據表的內容。 套用原則之前,
demo
數據表會顯示完整數據行。hive.executeQuery("SELECT * FROM demo").show()
套用數據行遮罩原則,只顯示數據行的最後四個字元。
移至位於
https://LLAPCLUSTERNAME.azurehdinsight.net/ranger/
的 Ranger 管理員 UI。按兩下叢 集的 Hive 服務。
按兩下 [ 遮罩] 索引 標籤,然後按兩下 [ 新增原則]
提供所需的原則名稱。 選取資料庫:預設、Hive 數據表:示範、Hive 數據行:名稱、使用者:rsadmin2、存取類型:選取和部分遮罩:從 [選取遮罩選項] 功能表顯示最後 4 個。 按一下新增。
再次檢視數據表的內容。 套用 ranger 原則之後,我們只能看到數據行的最後四個字元。