透過 JDBC 驅動程式在 HDInsight 中查詢 Apache Hive
瞭解如何從 Java 應用程式使用 JDBC 驅動程式。 若要將 Apache Hive 查詢提交至 Azure HDInsight 中的 Apache Hadoop。 本文件中的資訊示範如何以程序設計方式以及從用戶端連線 SQuirreL SQL
。
如需Hive JDBC 介面的詳細資訊,請參閱 HiveJDBCInterface。
必要條件
- HDInsight Hadoop 叢集。 若要建立,請參閱開始使用 Azure HDInsight。 請確定HiveServer2正在執行服務。
- Java Developer Kit (JDK) 第 11 版或更高版本。
- SQuirreL SQL。 SQuirreL 是 JDBC 用戶端應用程式。
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。
建立目錄以包含要從叢集複製的特定檔案。
在下列腳本中,將 取代
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} .
啟動 SQuirreL SQL 應用程式。 從視窗左側,選取 [ 驅動程式]。
從 [驅動程式] 對話框頂端的圖示中,選取+要建立驅動程式的圖示。
在 [新增驅動程式] 對話框中,新增下列資訊:
屬性 值 名稱 Hive 範例 URL jdbc:hive2://localhost:443/default;transportMode=http;ssl=true;httpPath=/hive2
額外類別路徑 使用 [ 新增 ] 按鈕來新增稍早下載的所有 jar 檔案。 類別名稱 org.apache.hive.jdbc.HiveDriver 選取 [ 確定 ] 以儲存這些設定。
在 [SQuirreL SQL] 視窗左側,選取 [別名]。 然後選取 + 圖示以建立連線別名。
針對 [ 新增別名 ] 對話框使用下列值:
屬性 值 名稱 HDInsight 上的 Hive 驅動程式 使用下拉式清單選取 Hive 驅動程式。 URL jdbc:hive2://CLUSTERNAME.azurehdinsight.net:443/default;transportMode=http;ssl=true;httpPath=/hive2
. 以 HDInsight 叢集的名稱取代 CLUSTERNAME 。使用者名稱 HDInsight 叢集的叢集登入帳戶名稱。 預設值為 admin。 密碼 叢集登入賬戶的密碼。 重要
使用 [ 測試] 按鈕來確認連線是否正常運作。 當 連線 至:HDInsight 上的 Hive 對話框出現時,請選取 連線 來執行測試。 如果測試成功,您會看到 連線 成功對話方塊。 如果發生錯誤,請參閱 疑難解答。
若要儲存連線別名,請使用 [新增別名] 對話框底部的 [確定] 按鈕。
從 連線 到 SQuirreL SQL 頂端的下拉式清單中,選取 [HDInsight 上的 Hive]。 出現提示時,請選取 [連接]。
聯機之後,在 [SQL 查詢] 對話框中輸入下列查詢,然後選取 [ 執行 ] 圖示 (執行中人員)。 結果區域應該會顯示查詢的結果。
select * from hivesampletable limit 10;
從範例 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檔案所造成。
解決方法:若要修正此錯誤,請使用下列步驟:
結束 SQuirreL,然後移至系統上安裝 SQuirreL 的目錄,或許
C:\Program Files\squirrel-sql-4.0.0\lib
是 。 在 SquirreL 目錄中,lib
將現有的commons-codec.jar取代為從 HDInsight 叢集下載的叢集。重新啟動 SQuirreL。 連線到 HDInsight 上的 Hive 時,不應該再發生錯誤。
HDInsight 中斷連線
徵兆:HDInsight 在嘗試透過 JDBC/ODBC 下載大量數據(例如數 GB)時,意外中斷連線。
原因:網關節點上的限制會導致此錯誤。 從 JDBC/ODBC 取得數據時,所有數據都必須通過網關節點。 不過,閘道並非設計來下載大量數據,因此如果閘道無法處理流量,閘道可能會關閉連線。
解決方案:避免使用 JDBC/ODBC 驅動程式下載大量數據。 請改為直接從 Blob 記憶體複製數據。
下一步
既然您已瞭解如何使用 JDBC 來處理 Hive,請使用下列連結來探索使用 Azure HDInsight 的其他方式。