Java JDBC連接Kerberos認(rèn)證的HIVE和Impala方式
1. 版本
HIVE 2.1.1-cdh6.3.2版本需對(duì)應(yīng)版本的 Hive JDBC 和 Impala JDBC,如下:
注意:?jiǎn)为?dú)使用HIVE JDBC ,使用版本 3.1.0,使用 Impala JDBC 需要搭配 HIVE JDBC 1.1.0使用,不然會(huì)報(bào)錯(cuò);搭配HIVE JDBC 3.1.0 報(bào):
java.lang.NoClassDefFoundError:org/apache/hive/service/cli/thrift/TCLIService$Client
<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.1.0</version> </dependency> <dependency> <!-- <dependency>--> <!-- <groupId>org.apache.hive</groupId>--> <!-- <artifactId>hive-jdbc</artifactId>--> <!-- <version>3.1.0</version>--> <!-- </dependency>--> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-auth</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>com.cloudera.impala</groupId> <artifactId>impala-jdbc41</artifactId> <version>2.5.28</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>1.1.0</version> </dependency>
1.1 手動(dòng)安裝 maven
如果 Maven 庫(kù)沒(méi)有相應(yīng)JDBC,手動(dòng)安裝 maven,如下:
mvn install:install-file -D file=C:\Users\mx\Desktop\impala-jdbc41-0.0.1.jar -D groupId=com.cloudera.impala -D artifactId=impala-jdbc42 -D version=2.6.33 -D packaging=jar
2. 映射地址
因kerberos SPN配置必須使用主機(jī)名鏈接,Linux 和 Windows需要配置hosts,格式:IP地址 主機(jī)名,配置完成之后 telnet 檢測(cè)
說(shuō)明:如果是docker容器鏈接 Hive 或 Impala ,還需要在docker容器中配置 hosts,保證主機(jī)和容器 telent 都是通的
telnet hostname port
2.1 端口
開(kāi)通 HIVE 和 Impala 相應(yīng)的端口,本地調(diào)試按需將 IP 和 端口加入白名單
- HIVE TCP端口:jdbc:hive2://hostname:10000
- Impala TCP端口:jdbc:impala://hostname:21050
- Hdfs TCP端口:hdfs://hostname:8020
- Kerberos UDP端口:88
2.2 調(diào)試
使用 telnet hostname port ,調(diào)試以上 hostname 和 端口,保障網(wǎng)絡(luò)連通
3. HIVE JDBC 連接 Kerberos 認(rèn)證的 HIVE 集群
package com.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.security.UserGroupInformation; public class HiveKerberosConnectionExample { private static String krb5 = "src/main/resources/krb5.conf"; private static String keytab = "src/main/resources/hive.keytab"; private static String principal = "hive@EXAMPLE.COM"; private static String hiveUrl = "jdbc:hive2://host:10000/test;principal=hive/_HOST@EXAMPLE.COM"; public static void main(String[] args) throws Exception { // 設(shè)置Kerberos配置文件路徑 System.setProperty("java.security.krb5.conf", krb5); System.setProperty("sun.security.krb5.debug", "true"); // 可選,用于調(diào)試 Kerberos 認(rèn)證過(guò)程 // 初始化Hadoop配置 Configuration conf = new Configuration(); conf.set("hadoop.security.authentication", "kerberos"); // 使用Keytab進(jìn)行Kerberos身份驗(yàn)證 UserGroupInformation.setConfiguration(conf); UserGroupInformation.loginUserFromKeytab(principal, keytab); // 建立Hive連接 Class.forName("org.apache.hive.jdbc.HiveDriver"); Connection connection = DriverManager.getConnection(hiveUrl, "", ""); // 執(zhí)行查詢 Statement stmt = connection.createStatement(); ResultSet res = stmt.executeQuery("select * from test.tblname"); // 處理結(jié)果 while (res.next()) { //a,b,c,ds 為 tblname表字段 String data = res.getString("a") + "," + res.getString("b") + "," + res.getString("c") + "," + res.getString("ds"); System.out.println("************** 輸出 tblname***************************"); System.out.println(data); } // 關(guān)閉資源 res.close(); stmt.close(); connection.close(); } }
4. HIVE JDBC 連接 Kerberos 認(rèn)證的 Impala 集群
package com.test; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.security.UserGroupInformation; import java.security.PrivilegedAction; import java.sql.*; public class ImpalaKerberosConnectionExample { private static String krb5 = "src/main/resources/krb5.conf"; private static String keytab = "src/main/resources/impala.keytab"; private static String principal = "impala@EXAMPLE.COM"; private static String impalaUrl = "jdbc:hive2://host:21050/test;principal=impala/_HOST@EXAMPLE.COM"; public static void main(String[] args) throws Exception { // 設(shè)置Kerberos配置文件路徑 System.setProperty("java.security.krb5.conf", krb5); System.setProperty("sun.security.krb5.debug", "true"); // 可選,用于調(diào)試 Kerberos 認(rèn)證過(guò)程 // 初始化Hadoop配置 Configuration conf = new Configuration(); conf.set("hadoop.security.authentication", "kerberos"); // 使用Keytab進(jìn)行Kerberos身份驗(yàn)證 UserGroupInformation.setConfiguration(conf); UserGroupInformation.loginUserFromKeytab(principal, keytab); UserGroupInformation loginUser = UserGroupInformation.getLoginUser(); //使用HIVE jdbc 建立Impala連接 Class.forName("org.apache.hive.jdbc.HiveDriver"); // Impala Jdbc 和 HIVE Jdbc 查詢 // loginUser.doAs((PrivilegedAction<Void>) () -> { // try { // try (Connection connection = DriverManager.getConnection(impalaUrl,"","")) { // try (Statement statement = connection.createStatement()) { // ResultSet resultSet = statement.executeQuery("SELECT * FROM test.tblname LIMIT 10"); // while (resultSet.next()) { // String data = resultSet.getString("a") + "," + resultSet.getString("b") + "," + resultSet.getString("c") + "," + resultSet.getString("ds"); // System.out.println("************** 輸出 tblname***************************"); // System.out.println(data); // } // resultSet.close(); // } // } // } catch (SQLException e) { // e.printStackTrace(); // } // return null; // }); // HIVE JDBC 查詢,Impala Jdbc 查詢報(bào) kerberos 認(rèn)證失敗 1312 碼 Connection connection = DriverManager.getConnection(impalaUrl, "", ""); Statement stmt = connection.createStatement(); ResultSet res = stmt.executeQuery("SELECT * FROM test.tlbname LIMIT 10"); // 處理結(jié)果 while (res.next()) { String data = res.getString("a") + "," + res.getString("b") + "," + res.getString("c") + "," + res.getString("ds"); System.out.println("************** Impala 輸出 tblname ***************************"); System.out.println(data); } // 關(guān)閉資源 res.close(); stmt.close(); connection.close(); } }
5. Impala JDBC 連接 Kerberos 認(rèn)證的 Impala 集群
package com.test; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.security.UserGroupInformation; import java.security.PrivilegedAction; import java.sql.*; public class ImpalaKerberosConnectionExample { private static String krb5 = "src/main/resources/krb5.conf"; private static String keytab = "src/main/resources/impala.keytab"; private static String principal = "impala@EXAMPLE.COM"; private static String impalaUrl = "jdbc:impala://host:21050/test;AuthMech=1;KrbRealm=EXAMPLE.COM;KrbHostFQDN=host;KrbServiceName=impala"; public static void main(String[] args) throws Exception { // 設(shè)置Kerberos配置文件路徑 System.setProperty("java.security.krb5.conf", krb5); System.setProperty("sun.security.krb5.debug", "true"); // 可選,用于調(diào)試 Kerberos 認(rèn)證過(guò)程 // 初始化Hadoop配置 Configuration conf = new Configuration(); conf.set("hadoop.security.authentication", "kerberos"); // 使用Keytab進(jìn)行Kerberos身份驗(yàn)證 UserGroupInformation.setConfiguration(conf); UserGroupInformation.loginUserFromKeytab(principal, keytab); UserGroupInformation loginUser = UserGroupInformation.getLoginUser(); // 使用 Impala jdbc 建立Impala連接 Class.forName("com.cloudera.impala.jdbc41.Driver");// 搭配HIVE JDBC 3.1.0報(bào):java.lang.NoClassDefFoundError: org/apache/hive/service/cli/thrift/TCLIService$Client //使用HIVE jdbc 建立Impala連接 // Class.forName("org.apache.hive.jdbc.HiveDriver"); // Impala查詢 loginUser.doAs((PrivilegedAction<Void>) () -> { try { try (Connection connection = DriverManager.getConnection(impalaUrl,"","")) { try (Statement statement = connection.createStatement()) { ResultSet resultSet = statement.executeQuery("SELECT * FROM test.tblname LIMIT 10"); while (resultSet.next()) { String data = resultSet.getString("a") + "," + resultSet.getString("b") + "," + resultSet.getString("c") + "," + resultSet.getString("ds"); System.out.println("************** Impala 輸出 tlbname ***************************"); System.out.println(data); } resultSet.close(); } } } catch (SQLException e) { e.printStackTrace(); } return null; }); } }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java陷阱之a(chǎn)ssert關(guān)鍵字詳解
這篇文章詳細(xì)介紹了Java陷阱之a(chǎn)ssert關(guān)鍵字,有需要的朋友可以參考一下2013-09-09Netty分布式Server啟動(dòng)流程服務(wù)端初始化源碼分析
本章主要講解server啟動(dòng)的關(guān)鍵步驟,?讀者只需要了解server啟動(dòng)的大概邏輯,?知道關(guān)鍵的步驟在哪個(gè)類執(zhí)行即可,?并不需要了解每一步的運(yùn)作機(jī)制,?之后會(huì)對(duì)每個(gè)模塊進(jìn)行深度分析2022-03-03Java中常用的設(shè)計(jì)模式之責(zé)任鏈模式詳解
這篇文章主要為大家詳細(xì)介紹了Java中常用的設(shè)計(jì)模式之責(zé)任鏈模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02mybatis 一對(duì)一、一對(duì)多和多對(duì)多查詢實(shí)例代碼
這篇文章主要介紹了mybatis 一對(duì)一、一對(duì)多和多對(duì)多查詢的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06Java將CSV的數(shù)據(jù)發(fā)送到kafka的示例
這篇文章主要介紹了Java將CSV的數(shù)據(jù)發(fā)送到kafka得示例,幫助大家更好得理解和使用Java,感興趣的朋友可以了解下2020-11-11JAVA如何獲取jvm和操作系統(tǒng)相關(guān)信息
這篇文章主要介紹了JAVA獲取jvm和操作系統(tǒng)相關(guān)信息,使用Java自帶的類進(jìn)行獲取系統(tǒng)運(yùn)行的相關(guān)信息,在這整理記錄分享一下,需要的朋友可以參考下2022-10-10Spring系統(tǒng)屬性及spring.properties配置文件示例詳解
spring中有一個(gè)SpringProperties類,來(lái)保存spring的系統(tǒng)屬性,本文結(jié)合實(shí)例代碼對(duì)Spring系統(tǒng)屬性及spring.properties配置文件相關(guān)知識(shí)給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-07-07springboot使用@Slf4j進(jìn)行日志的記錄步驟詳解
這篇文章主要介紹了springboot使用@Slf4j進(jìn)行日志的記錄,使用@Slf4j的注解進(jìn)行日志記錄非常方便,本文給大家分享操作步驟,需要的朋友可以參考下2023-08-08永久解決 Intellij idea 報(bào)錯(cuò):Error :java 不支持發(fā)行版本5的問(wèn)題
這篇文章主要介紹了永久解決 Intellij idea 報(bào)錯(cuò):Error :java 不支持發(fā)行版本5的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02