Hive連接方式
本文為您介紹在E-MapReduce集群提交Hive SQL的三種方式。
前提條件
已創(chuàng)建集群,且選擇了Hive服務(wù),詳情請參見創(chuàng)建集群。
注意事項
方式一:通過Hive客戶端連接Hive
普通集群
hive
高安全集群
執(zhí)行如下命令進行認證。
執(zhí)行如下命令進行認證。
kinit 用戶名
根據(jù)提示輸入用戶的密碼。
連接Hive。
kinit -kt /etc/emr/hive-conf/keytab/hive.keytab hive/<主節(jié)點的節(jié)點名稱>.cluster-xxx@EMR.xxx.COM
您也可以通過用戶管理功能創(chuàng)建用戶,在連接Beeline前使用kinit 用戶名
并輸入密碼,即可通過新建用戶使用Beeline客戶端。創(chuàng)建用戶詳情請參見管理用戶。
hive
方式二:通過Beeline客戶端連接HiveServer2
普通集群
beeline -u jdbc:hive2://<主節(jié)點的節(jié)點名稱>:10000
根據(jù)您的集群類型,對應(yīng)命令如下:
DataLake集群
beeline -u jdbc:hive2://master-1-1:10000
Hadoop集群
beeline -u jdbc:hive2://emr-header-1:10000
高可用集群
根據(jù)您集群的類型,對應(yīng)命令如下:
DataLake集群
設(shè)置serviceDiscoveryMode為zooKeeper的方式
beeline -u 'jdbc:hive2://master-1-1:2181,master-1-2:2181,master-1-3:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2'
設(shè)置serviceDiscoveryMode為multiServers的方式
beeline -u 'jdbc:hive2://master-1-1:10000,master-1-2:10000,master-1-3:10000/default;serviceDiscoveryMode=multiServers'
Hadoop集群
設(shè)置serviceDiscoveryMode為zooKeeper的方式
beeline -u 'jdbc:hive2://emr-header-1:2181,emr-header-2:2181,emr-header-3:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2'
設(shè)置serviceDiscoveryMode為multiServers的方式
beeline -u 'jdbc:hive2://emr-header-1:10000,emr-header-2:10000,emr-header-3:10000/default;serviceDiscoveryMode=multiServers'
高安全集群
執(zhí)行如下命令進行認證。
kinit -kt /etc/ecm/hive-conf/hive.keytab hive/<主節(jié)點的節(jié)點名稱>.cluster-xxx@EMR.xxx.COM
您也可以通過用戶管理功能創(chuàng)建用戶,在連接Beeline前使用
kinit 用戶名
并輸入密碼,即可通過新建用戶使用Beeline客戶端。創(chuàng)建用戶詳情請參見管理用戶。執(zhí)行如下命令進行認證。
kinit 用戶名
根據(jù)提示輸入用戶的密碼。
連接Beeline。
beeline -u "jdbc:hive2://<主節(jié)點的節(jié)點名稱>:10000/;principal=hive/<主節(jié)點的節(jié)點名稱>.cluster-xxx@EMR.xxx.COM"
說明jdbc
鏈接串需要用雙引號括起來。
方式三:通過Java連接HiveServer2
在執(zhí)行本操作前,確保您已安裝Java環(huán)境和Java編程工具,并且已配置環(huán)境變量。
在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表數(shù)據(jù)。示例代碼如下所示。
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包的環(huán)境需要在hosts文件中把master-1-1 // 映射到E-MapReduce集群的公網(wǎng)IP地址(或內(nèi)網(wǎng)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包至運行環(huán)境。
重要JAR包的運行需要依賴hadoop-common和hive-jdbc。如果運行環(huán)境的環(huán)境變量中未包含這兩個依賴包,則您需要下載依賴包并配置環(huán)境變量,或者直接一起打包這兩個依賴包。運行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節(jié)點。
測試JAR包是否可以正常運行。
重要運行JAR包的服務(wù)器與E-MapReduce集群需要在同一個VPC和安全組下,并且網(wǎng)絡(luò)可達。如果兩者的VPC不同或網(wǎng)絡(luò)環(huán)境不同,則需要通過公網(wǎng)地址訪問,或先使用網(wǎng)絡(luò)產(chǎn)品打通兩者的網(wǎng)絡(luò),再通過內(nèi)網(wǎng)訪問。網(wǎng)絡(luò)連通性測試方法:
公網(wǎng):
telnet master-1-1的公網(wǎng)IP地址 10000
內(nèi)網(wǎng):
telnet master-1-1的內(nèi)網(wǎng)IP地址 10000
java -jar emr-hiveserver2-1.0.jar