透過 JDBC 驅動程式在 HDInsight 中查詢 Apache Hive

瞭解如何從 Java 應用程式使用 JDBC 驅動程式。 若要將 Apache Hive 查詢提交至 Azure HDInsight 中的 Apache Hadoop。 本文件中的資訊示範如何以程序設計方式以及從用戶端連線 SQuirreL SQL

如需Hive JDBC 介面的詳細資訊,請參閱 HiveJDBCInterface

必要條件

JDBC 連接字串

Azure 上 HDInsight 叢集的 JDBC 連線是透過埠 443 進行。 流量會使用 TLS/SSL 來保護。 叢集所在的公用閘道會將流量重新導向至HiveServer2實際接聽的埠。 下列 連接字串 顯示要用於 HDInsight 的格式:

    jdbc:hive2://CLUSTERNAME.azurehdinsight.net:443/default;transportMode=http;ssl=true;httpPath=/hive2

CLUSTERNAME 替換為 HDInsight 叢集的名稱。

連接字串 中的主機名

連接字串 中的主機名 『CLUSTERNAME.azurehdinsight.net』 與您的叢集 URL 相同。 您可以透過 Azure 入口網站 取得它。

連接字串 中的埠

您只能使用 埠 443 從 Azure 虛擬網路外部的某些位置連線到叢集。 HDInsight 是受控服務,這表示叢集的所有連線都是透過安全的閘道進行管理。 您無法直接在埠 10001 或 10000 上連線到 HiveServer 2。 這些埠不會向外部公開。

驗證

建立連線時,請使用 HDInsight 叢集管理員名稱和密碼進行驗證。 從 SQuirreL SQL 等 JDBC 用戶端,在用戶端設定中輸入系統管理員名稱和密碼。

從 Java 應用程式,您必須在建立連線時使用名稱和密碼。 例如,下列 Java 程式代碼會開啟新的連線:

DriverManager.getConnection(connectionString,clusterAdmin,clusterPassword);

使用 SQuirreL SQL 用戶端 連線

SQuirreL SQL 是 JDBC 用戶端,可用來使用 HDInsight 叢集從遠端執行 Hive 查詢。 下列步驟假設您已經安裝 SQuirreL SQL。

  1. 建立目錄以包含要從叢集複製的特定檔案。

  2. 在下列腳本中,將 取代 sshuser 為叢集的 SSH 使用者帳戶名稱。 將取代 CLUSTERNAME 為 HDInsight 叢集名稱。 從命令行將工作目錄變更為在上一個步驟中建立的工作目錄,然後輸入下列命令,從 HDInsight 叢集複製檔案:

    scp sshuser@CLUSTERNAME-ssh.azurehdinsight.net:/usr/hdp/current/hadoop-client/{hadoop-auth.jar,hadoop-common.jar,lib/log4j-*.jar,lib/slf4j-*.jar,lib/curator-*.jar} . -> scp sshuser@CLUSTERNAME-ssh.azurehdinsight.net:/usr/hdp/current/hadoop-client/{hadoop-auth.jar,hadoop-common.jar,lib/reload4j-*.jar,lib/slf4j-*.jar,lib/curator-*.jar} .
    
    scp sshuser@CLUSTERNAME-ssh.azurehdinsight.net:/usr/hdp/current/hive-client/lib/{commons-codec*.jar,commons-logging-*.jar,hive-*-*.jar,httpclient-*.jar,httpcore-*.jar,libfb*.jar,libthrift-*.jar} .
    
  3. 啟動 SQuirreL SQL 應用程式。 從視窗左側,選取 [ 驅動程式]。

    Drivers tab on the left of the window.

  4. 從 [驅動程式] 對話框頂端的圖示中,選取+要建立驅動程式的圖示。

    SQuirreL SQL application drivers icon.

  5. 在 [新增驅動程式] 對話框中,新增下列資訊:

    屬性
    名稱 Hive
    範例 URL jdbc:hive2://localhost:443/default;transportMode=http;ssl=true;httpPath=/hive2
    額外類別路徑 使用 [ 新增 ] 按鈕來新增稍早下載的所有 jar 檔案。
    類別名稱 org.apache.hive.jdbc.HiveDriver

    add driver dialog with parameters.

    選取 [ 確定 ] 以儲存這些設定。

  6. 在 [SQuirreL SQL] 視窗左側,選取 [別名]。 然後選取 + 圖示以建立連線別名。

    `SQuirreL SQL add new alias dialog`.

  7. 針對 [ 新增別名 ] 對話框使用下列值:

    屬性
    名稱 HDInsight 上的 Hive
    驅動程式 使用下拉式清單選取 Hive 驅動程式。
    URL jdbc:hive2://CLUSTERNAME.azurehdinsight.net:443/default;transportMode=http;ssl=true;httpPath=/hive2. 以 HDInsight 叢集的名稱取代 CLUSTERNAME
    使用者名稱 HDInsight 叢集的叢集登入帳戶名稱。 預設值為 admin
    密碼 叢集登入賬戶的密碼。

    add alias dialog with parameters.

    重要

    使用 [ 測試] 按鈕來確認連線是否正常運作。 當 連線 至:HDInsight 上的 Hive 對話框出現時,請選取 連線 來執行測試。 如果測試成功,您會看到 連線 成功對話方塊。 如果發生錯誤,請參閱 疑難解答

    若要儲存連線別名,請使用 [新增別名] 對話框底部的 [確定] 按鈕。

  8. 從 連線 到 SQuirreL SQL 頂端的下拉式清單中,選取 [HDInsight 上的 Hive]。 出現提示時,請選取 [連接]

    connection dialog with parameters.

  9. 聯機之後,在 [SQL 查詢] 對話框中輸入下列查詢,然後選取 [ 執行 ] 圖示 (執行中人員)。 結果區域應該會顯示查詢的結果。

    select * from hivesampletable limit 10;
    

    sql query dialog, including results.

從範例 Java 應用程式 連線

如需使用 Java 用戶端在 HDInsight 上查詢 Hive 的範例,請參閱 https://github.com/Azure-Samples/hdinsight-java-hive-jdbc。 請遵循存放庫中的指示來建置並執行範例。

疑難排解

嘗試開啟 SQL 連線時,發生非預期的錯誤

徵兆:連線到 3.3 版或更新版本的 HDInsight 叢集時,您可能會收到發生非預期錯誤的錯誤。 此錯誤堆疊追蹤開頭為下列幾行:

java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.<init>(I)V
at java.util.concurrent.FutureTas...(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:206)

原因:此錯誤是由 SQuirreL 隨附的舊版commons-codec.jar檔案所造成。

解決方法:若要修正此錯誤,請使用下列步驟:

  1. 結束 SQuirreL,然後移至系統上安裝 SQuirreL 的目錄,或許 C:\Program Files\squirrel-sql-4.0.0\lib是 。 在 SquirreL 目錄中, lib 將現有的commons-codec.jar取代為從 HDInsight 叢集下載的叢集。

  2. 重新啟動 SQuirreL。 連線到 HDInsight 上的 Hive 時,不應該再發生錯誤。

HDInsight 中斷連線

徵兆:HDInsight 在嘗試透過 JDBC/ODBC 下載大量數據(例如數 GB)時,意外中斷連線。

原因:網關節點上的限制會導致此錯誤。 從 JDBC/ODBC 取得數據時,所有數據都必須通過網關節點。 不過,閘道並非設計來下載大量數據,因此如果閘道無法處理流量,閘道可能會關閉連線。

解決方案:避免使用 JDBC/ODBC 驅動程式下載大量數據。 請改為直接從 Blob 記憶體複製數據。

下一步

既然您已瞭解如何使用 JDBC 來處理 Hive,請使用下列連結來探索使用 Azure HDInsight 的其他方式。