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

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

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

先決條件

JDBC 連接字串

透過連接埠 443 在 Azure 上建立 HDInsight 叢集的 JDBC 連接。 會使用 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 是可用來從遠端以 HDInsight 叢集執行 Hive 查詢的 JDBC 用戶端。 下列步驟假設您已安裝 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 應用程式。 從視窗左側選取 [驅動程式]

    視窗左側的 [驅動程式] 索引標籤

  4. 從 [驅動程式] 對話方塊上方的圖示,選取 []+ 圖示以建立驅動程式。

    SQuirreL SQL 應用程式驅動程式圖示

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

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

    含有參數的新增驅動程式對話方塊

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

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

    `SQuirreL SQL 新增新別名對話方塊`

  7. 在 [新增別名] 對話方塊中使用下列值:

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

    含有參數的新增別名對話方塊

    重要事項

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

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

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

    含有參數的連線對話方塊

  9. 連接後,請在 SQL 查詢對話方塊中輸入下列查詢,然後選取 [執行] 圖示 (一個奔跑的小人)。 結果區域應該會顯示查詢的結果。

    select * from hivesampletable limit 10;
    

    sql 查詢對話方塊,包括結果

從範例 Java 應用程式連接

您可以在 https://github.com/Azure-Samples/hdinsight-java-hive-jdbc 上找到使用 Java 用戶端在 HDInsight 上查詢 Hive 的範例。 遵循儲存機制中的指示建置和執行範例。

疑難排解

嘗試開啟 SQL 連接時,發生意外的錯誤

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

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 目錄下,使用從 HDInsight 叢集下載的版本來取代現有的 commons-codec.jar。

  2. 重新啟動 SQuirreL。 連接到 HDInsight 上的 Hive 時應該不會再出現此錯誤。

HDInsight 中斷連線

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

原因:此錯誤是由閘道節點上的限制所造成。 從 JDBC/ODBC 取得資料時,所有資料都必須通過閘道節點。 不過,閘道並非設計來下載大量資料的,因此閘道可能會在無法處理流量時關閉連線。

解決方式:避免使用 JDBC/ODBC 驅動程式下載大量資料。 請改為直接從 Blob 儲存體複製資料。

後續步驟

現在您已學會如何搭配 Hive 使用 JDBC,接著請使用下列連結來探索 Azure HDInsight 的其他使用方式。