本文為您介紹在E-MapReduce叢集提交Hive SQL的三種方式。
前提條件
已建立叢集,且選擇了Hive服務,詳情請參見建立叢集。
注意事項
方式一:通過Hive用戶端串連Hive
普通叢集
hive
高安全叢集
執行如下命令進行認證。
執行如下命令進行認證。
kinit 使用者名稱
根據提示輸入使用者的密碼。
串連Hive。
kinit -kt /etc/ecm/hive-conf/hive.keytab hive/<主節點的節點名稱>.cluster-xxx@EMR.xxx.COM
您也可以通過使用者管理功能建立使用者,在串連Beeline前使用kinit 使用者名稱
並輸入密碼,即可通過建立使用者使用Beeline用戶端。建立使用者詳情請參見系統管理使用者。
hive
方式二:通過Beeline用戶端串連HiveServer2
普通叢集
beeline -u jdbc:hive2://<主節點的節點名稱>:10000
根據您的叢集類型,對應命令如下:
DataLake叢集
beeline -u jdbc:hive2://master-1-1:10000
Hadoop叢集
beeline -u jdbc:hive2://emr-header-1:10000
高可用叢集
根據您叢集的類型,對應命令如下:
DataLake叢集
設定serviceDiscoveryMode為zooKeeper的方式
beeline -u 'jdbc:hive2://master-1-1:2181,master-1-2:2181,master-1-3:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2'
設定serviceDiscoveryMode為multiServers的方式
beeline -u 'jdbc:hive2://master-1-1:10000,master-1-2:10000,master-1-3:10000/default;serviceDiscoveryMode=multiServers'
Hadoop叢集
設定serviceDiscoveryMode為zooKeeper的方式
beeline -u 'jdbc:hive2://emr-header-1:2181,emr-header-2:2181,emr-header-3:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2'
設定serviceDiscoveryMode為multiServers的方式
beeline -u 'jdbc:hive2://emr-header-1:10000,emr-header-2:10000,emr-header-3:10000/default;serviceDiscoveryMode=multiServers'
高安全叢集
執行如下命令進行認證。
kinit -kt /etc/ecm/hive-conf/hive.keytab hive/<主節點的節點名稱>.cluster-xxx@EMR.xxx.COM
您也可以通過使用者管理功能建立使用者,在串連Beeline前使用
kinit 使用者名稱
並輸入密碼,即可通過建立使用者使用Beeline用戶端。建立使用者詳情請參見系統管理使用者。執行如下命令進行認證。
kinit 使用者名稱
根據提示輸入使用者的密碼。
串連Beeline。
beeline -u "jdbc:hive2://<主節點的節點名稱>:10000/;principal=hive/<主節點的節點名稱>.cluster-xxx@EMR.xxx.COM"
說明jdbc
連結串需要用雙引號括起來。
方式三:通過Java串連HiveServer2
在執行本操作前,確保您已安裝Java環境和Java編程工具,並且已配置環境變數。
在pom.xml檔案中設定項目依賴(hadoop-common和hive-jdbc)。本樣本新增的專案依賴如下所示。
<dependencies> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>2.3.9</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.8.5</version> </dependency> </dependencies>
編寫代碼,串連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(); } // 1. 代碼打包後,運行JAR包的環境需要在hosts檔案中把master-1-1 // 映射到E-MapReduce叢集的公網IP地址(或內網IP地址) // 2. 更多JDBC串連串路徑可以參考“方式二:通過Beeline用戶端串連HiveServer2” Connection con = DriverManager.getConnection( "jdbc:hive2://master-1-1: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)); } } }
打包專案工程(即產生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,上傳到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