本文為您介紹在E-MapReduce中如何使用Hive用戶端、Beeline、JDBC三種方式串連Hive。
前提條件
注意事項
操作步驟
普通叢集
通過Hive用戶端串連
執行以下命令,串連Hive。
hive可選: 執行
quit;或exit;,可以退出Hive。
通過Beeline用戶端串連
執行以下命令,串連Hive。
beeline -u jdbc:hive2://master-1-1:10000可選: 執行
!quit或!exit,可以退出Beeline。
通過JDBC方式串連
在執行本操作之前,請確保您已安裝Java環境及Java編程工具,並已正確配置相關環境變數。
在
pom.xml檔案中設定項目依賴(hadoop-common和hive-jdbc)。本樣本新增的專案依賴如下所示。<dependencies> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>3.1.3</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.2.1</version> </dependency> </dependencies>請確保hadoop-common和hive-jdbc的版本資訊與EMR叢集中Hadoop-Common和Hive的軟體資訊保持一致。軟體資訊可以在EMR控制台目的地組群基礎資訊頁簽的軟體資訊地區查看。
編寫代碼,串連HiveServer2並操作Hive表資料。範例程式碼如下所示。
import java.sql.*; public class App { private static String driverName = "org.apache.hive.jdbc.HiveDriver"; public static void main(String[] args) throws SQLException { try { Class.forName(driverName); } catch (ClassNotFoundException e) { e.printStackTrace(); } Connection con = DriverManager.getConnection( "jdbc:hive2://<Master節點的公網IP地址>:10000", "root", ""); Statement stmt = con.createStatement(); String sql = "select * from sample_tbl limit 10"; ResultSet res = stmt.executeQuery(sql); while (res.next()) { System.out.println(res.getString(1) + "\t" + res.getString(2)); } } }說明使用該方式需要開放10000連接埠,詳情請參見管理安全性群組。
驗證打包專案工程(即產生的JAR包),並上傳JAR包至運行環境。
重要JAR包的運行需要依賴hadoop-common和hive-jdbc。如果運行環境的環境變數中未包含這兩個依賴包,您需要下載並配置這些依賴包,或者將這兩個依賴包直接打包在一起。運行JAR包時,如果缺少這兩個依賴包,則會提示以下錯誤:
缺失hadoop-common:提示
java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration。缺失hive-jdbc:提示
java.lang.ClassNotFoundException: org.apache.hive.jdbc.HiveDriver。
本樣本產生的JAR包為
emr-hiveserver2-1.0.jar,需將該JAR包上傳至E-MapReduce叢集的Master節點。測試JAR包是否可以正常運行。
重要運行JAR包的伺服器與E-MapReduce叢集需要在同一個VPC和安全性群組下,並且網路可達。如果兩者的VPC不同或網路環境不同,則需要通過公網地址訪問,或先使用網路產品打通兩者的網路,再通過內網訪問。網路連通性測試方法:
公網:
telnet master-1-1的公網IP地址 10000內網:
telnet master-1-1的內網IP地址 10000
java -jar emr-hiveserver2-1.0.jar
高安全叢集
通過Hive用戶端串連
執行以下命令,進入Kerberos的admin.local工具。
如果您是使用root使用者,登入KDC(Kerberos的服務端程式)所在的master-1-1節點,則可以執行以下命令,直接進入admin工具。
kadmin.local當返回資訊中包含如下資訊時,表示已進入admin.local命令列。
Authenticating as principal hadoop/admin@EMR.C-85D4B8D74296****.COM with password. kadmin.local:如果您登入的是其他節點或者使用Gateway時,則可以通過填寫admin-user和admin-password進入admin工具。
kadmin -p <admin-user> -w <admin-password>說明如果您使用的是EMR自建的KDC,則參數:
<admin-user>:固定值為root/admin。<admin-password>:您可以在E-MapReduce控制台,Kerberos服務的配置頁面,擷取admin_pwd的參數值。
當返回資訊中包含如下資訊時,表示已進入admin命令列。
Authenticating as principal root/admin with password. kadmin:
執行以下命令,建立使用者名稱為test的Principal。
本文樣本密碼設定為123456。
addprinc -pw 123456 test當返回資訊中包含如下資訊時,表示建立成功。
Principal "test@EMR.C-85D4B8D74296****.COM" created.說明需要記錄使用者名稱和密碼,在建立TGT(Ticket Granting Ticket)時會用到。
執行
quit命令,可以退出Kerberos的admin.local工具。登入您需要運行Hive Client的機器,執行以下命令,建立並切換至test使用者。
useradd test su test執行以下命令,建立TGT。
kinit斷行符號後輸入test使用者的密碼,本文樣本密碼為123456。
直接使用
hive命令訪問Hive Client。hive
通過Beeline用戶端串連
執行以下命令,進入Kerberos的admin.local工具。
如果您是使用root使用者,登入KDC(Kerberos的服務端程式)所在的master-1-1節點,則可以執行以下命令,直接進入admin工具。
kadmin.local當返回資訊中包含如下資訊時,表示已進入admin.local命令列。
Authenticating as principal hadoop/admin@EMR.C-85D4B8D74296****.COM with password. kadmin.local:如果您登入的是其他節點或者使用Gateway時,則可以通過填寫admin-user和admin-password進入admin工具。
kadmin -p <admin-user> -w <admin-password>說明如果您使用的是EMR自建的KDC,則參數:
<admin-user>:固定值為root/admin。<admin-password>:您可以在E-MapReduce控制台,Kerberos服務的配置頁面,擷取admin_pwd的參數值。
當返回資訊中包含如下資訊時,表示已進入admin命令列。
Authenticating as principal root/admin with password. kadmin:
執行以下命令,建立使用者名稱為test的Principal。
本文樣本密碼設定為123456。
addprinc -pw 123456 test當返回資訊中包含如下資訊時,表示建立成功。
Principal "test@EMR.C-85D4B8D74296****.COM" created.說明需要記錄使用者名稱和密碼,在建立TGT(Ticket Granting Ticket)時會用到。
執行
quit命令,可以退出Kerberos的admin.local工具。登入您需要運行Hive Client的機器,執行以下命令,建立並切換至test使用者。
useradd test su test執行以下命令,建立TGT。
kinit斷行符號後輸入test使用者的密碼,本文樣本密碼為123456。
執行以下命令,訪問Hive Client。
beeline -u "jdbc:hive2://master-1-1.c-56187feb57f0****.cn-hangzhou.emr.aliyuncs.com:10000/;principal=hive/_HOST@EMR.c-56187feb57f0****.COM"其中,以下資訊需要您按照實際情況替換:
master-1-1.c-56187feb57f0****.cn-hangzhou.emr.aliyuncs.com:完整的主機名稱(包括網域名稱)。您可以通過在HiveServer2服務的節點(通常是master-1-1節點)執行hostname -f命令擷取。EMR.c-56187feb57f0****.COM:realm名稱。您可以在EMR控制台Kerberos服務的配置頁簽,搜尋並查看realm參數,參數值即為該realm名稱。
高可用叢集
通過Beeline用戶端串連
根據您所選擇的服務發現模式(zooKeeper 或 multiServers),使用以下相應的命令來配置Beeline串連。
使用zooKeeper模式
beeline -u 'jdbc:hive2://master-1-1:2181,master-1-2:2181,master-1-3:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2'使用multiServers模式
beeline -u 'jdbc:hive2://master-1-1:10000,master-1-2:10000,master-1-3:10000/default;serviceDiscoveryMode=multiServers'
