在 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 architecture.

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

建立叢集

  1. 使用記憶體帳戶和自定義 Azure 虛擬網路建立 HDInsight Spark 4.0 叢集。 如需在 Azure 虛擬網路中建立叢集的資訊,請參閱 將 HDInsight 新增至現有的虛擬網路

  2. 使用與Spark叢集相同的記憶體帳戶和 Azure 虛擬網路,建立 HDInsight 互動式查詢 (LLAP) 4.0 叢集。

設定 HWC 設定

收集初步資訊

  1. 從網頁瀏覽器,流覽至 https://LLAPCLUSTERNAME.azurehdinsight.net/#/main/services/HIVE LLAPCLUSTERNAME 是您互動式查詢叢集的名稱。

  2. 流覽至 [摘要>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

  3. 流覽至 [設定>進階進階>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

  4. 流覽至 [Configs>進階>一般>hive.metastore.uris],並記下值。 值可能類似: thrift://iqgiro.rekufuk2y2cezcbowjkbwfnyvd.bx.internal.cloudapp.net:9083,thrift://hn*.rekufuk2y2cezcbowjkbwfnyvd.bx.internal.cloudapp.net:9083

  5. 流覽至 [設定>進階進階>hive-interactive-site>hive.llap.daemon.service.hosts ],並記下此值。 值可能類似: @llap0

設定 Spark 叢集設定

  1. 從網頁瀏覽器,流覽至 https://CLUSTERNAME.azurehdinsight.net/#/main/services/SPARK2/configs CLUSTERNAME是您Apache Spark 叢集的名稱。

  2. 展開 [自定義 spark2- 預設值]。

    Apache Ambari Spark2 configuration.

  3. 選取 [新增屬性... ] 以新增下列組態:

    組態
    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取得的值。
  4. 儲存變更並重新啟動所有受影響的元件。

設定適用於企業安全性套件的 HWC (ESP) 叢集

企業安全性套件 (ESP) 提供企業級功能,例如 Active Directory 型驗證、多用戶支援,以及 Azure HDInsight 中 Apache Hadoop 叢集的角色型存取控制。 如需 ESP 的詳細資訊,請參閱 在 HDInsight 中使用企業安全性套件。

除了上一節所述的組態之外,新增下列組態以在 ESP 叢集上使用 HWC。

  1. 從 Spark 叢集的 Ambari Web UI,流覽至 Spark2>CONFIGS> 自定義 spark2 預設值。

  2. 更新下列屬性。

    組態
    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> 為此值。

      hive warehouse connector Head Node.

    • 使用 ssh 命令 連線到您的互動式查詢叢集。 在檔案中/etc/krb5.conf尋找 default_realm 參數。 將 取代 <AAD-DOMAIN> 為此值作為大寫字串,否則找不到認證。

      hive warehouse connector AAD Domain.

    • 例如 hive/hn*.mjry42ikpruuxgs2qy2kpg4q5e.cx.internal.cloudapp.net@PKRSRVUQVMAE6J85.D2.INTERNAL.CLOUDAPP.NET

  3. 視需要儲存變更並重新啟動元件。

Hive 倉儲 連線 或使用量

您可以選擇幾個不同的方法來連線到互動式查詢叢集,並使用Hive Warehouse 連線 or 執行查詢。 支援的方法包括下列工具:

以下是從 Spark 連線到 HWC 的一些範例。

Spark 殼層

這是透過已修改的 Scala 殼層版本以互動方式執行 Spark 的方式。

  1. 使用 ssh 命令來連線到 Apache Spark 叢集。 編輯以下命令並將 CLUSTERNAME 取代為您叢集的名稱,然後輸入命令:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. 從 ssh 工作階段執行下列命令,以記下 hive-warehouse-connector-assembly 版本:

    ls /usr/hdp/current/hive_warehouse_connector
    
  3. 使用上面所識別的 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
    
  4. 啟動 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 叢集上的數據

  1. 輸入下列命令,以建立含有一些範例數據的數據表 demo

    create table demo (name string);
    INSERT INTO demo VALUES ('HDinsight');
    INSERT INTO demo VALUES ('Microsoft');
    INSERT INTO demo VALUES ('InteractiveQuery');
    
  2. 使用下列命令檢視數據表的內容。 套用原則之前, demo 數據表會顯示完整數據行。

    hive.executeQuery("SELECT * FROM demo").show()
    

    demo table before applying ranger policy.

  3. 套用數據行遮罩原則,只顯示數據行的最後四個字元。

    1. 移至位於https://LLAPCLUSTERNAME.azurehdinsight.net/ranger/的 Ranger 管理員 UI。

    2. 按兩下叢 集的 Hive 服務。 ranger service manager.

    3. 按兩下 [ 遮罩] 索引 標籤,然後按兩下 [ 新增原則]

      hive warehouse connector ranger hive policy list.

    4. 提供所需的原則名稱。 選取資料庫:預設、Hive 數據表:示範、Hive 數據行:名稱、使用者:rsadmin2、存取類型:選取和部分遮罩:從 [選取遮罩選項] 功能表顯示最後 4 個。 按一下新增create policy.

  4. 再次檢視數據表的內容。 套用 ranger 原則之後,我們只能看到數據行的最後四個字元。

    demo table after applying ranger policy.

下一步