环境
| 版本 | |
|---|---|
| java | 8 |
| cdh | 6.3 |
| impala | 3.2 |
| hive | 3.0 |
| 代码开发环境 | windows10 |
两种连接方式
| 说明 | |
|---|---|
| hivejdbc | 比较方便一点,直接可以从maven远程仓库下载驱动,用hive的jdbc驱动连接impala |
| impalajdbc | impala自身的jdbc驱动,但是在maven的远程仓库中没有,需要在官网下载 |
一、impala的jdbc驱动连接impala
1. 驱动下载
- 连接impala的jdbc驱动在maven远程仓库中没有,需要到官网下载
- 这个下载是需要先注册账号的哦!免费注册哒
点击去官网下载:https://www.cloudera.com/search.html?q=impala%20jdbc

2. 导入impala的jdbc包
下载解压后,打开文件夹,里面有两个名字类似的文件夹,选择一个即可

打开即可看到一个jar包,将其导入到我们的环境

* 我这里是导入到了idea中

3. 导入maven外部依赖
这里只需要导入一个hadoop的就可以
<dependencies>
<dependency>
<groupid>org.apache.hadoop</groupid>
<artifactid>hadoop-common</artifactid>
<version>3.0.0</version>
</dependency>
</dependencies>4. 主程序
import org.apache.hadoop.conf.configuration;
import org.apache.hadoop.security.usergroupinformation;
import java.security.privilegedaction;
import java.sql.connection;
import java.sql.drivermanager;
import java.sql.resultset;
import java.sql.statement;
/**
* @date: 2022/1/5
* @author: bigbig-data
* @description: 注: impala的jdbc驱动maven远程仓库中没有, 需要从别的地方下载: https://www.cloudera.com/search.html?q=impala%20jdbc
*/
public class iconnectimpalakerberos {
// kerberos
public static final string krb5_conf = "c:/windows/krb5.ini";//linux中叫 krb5.conf,改后缀即可
public static final string principal = "normtest@hadoop.com";
public static final string keytab = "c:/windows/normtest.keytab";
// impala jdbc url 参数可参考官方文档 https://docs.cloudera.com/documentation/other/connectors/impala-jdbc/latest/cloudera-jdbc-driver-for-impala-install-guide.pdf
public static string connectionurl = "jdbc:impala://host:21050/;authmech=1;krbrealm=hadoop.com;krbhostfqdn=host;krbservicename=impala";
// 从官网下载的jar包
public static string jdbcdrivername = "com.cloudera.impala.jdbc.driver";
public static void main(string[] args) throws exception {
system.setproperty("java.security.krb5.conf", krb5_conf);
configuration conf = new configuration();
conf.set("hadoop.security.authentication", "kerberos");
usergroupinformation.setconfiguration(conf);
usergroupinformation.loginuserfromkeytab(principal, keytab);
system.out.println(">> 1. login from keytab " + keytab + " success");
usergroupinformation loginuser = usergroupinformation.getloginuser();
int result = loginuser.doas(new privilegedaction<integer>() {
@override
public integer run() {
int result = 0;
//加载驱动
try {
class.forname(jdbcdrivername);
} catch (classnotfoundexception e) {
e.printstacktrace();
}
system.out.println(">> 2. jdbcdriver load success");
try (connection con = drivermanager.getconnection(connectionurl)) {
system.out.println(">> 3. login impala sussecs");
statement stmt = con.createstatement();
resultset rs = stmt.executequery("select count(1) from norm_demo");
while (rs.next()) {
result = rs.getint(1);
}
stmt.close();
con.close();
} catch (exception e) {
e.printstacktrace();
}
return result;
}
});
system.out.println("表行数: "+ result);
}
}
二、hive的jdbc驱动连接impala
1. 导入maven外部依赖
<dependencies>
<dependency>
<groupid>org.apache.hadoop</groupid>
<artifactid>hadoop-common</artifactid>
<version>3.0.0</version>
</dependency>
<dependency>
<groupid>org.apache.hive</groupid>
<artifactid>hive-jdbc</artifactid>
<version>1.2.1</version>
</dependency>
</dependencies>2. 主程序
import org.apache.hadoop.conf.configuration;
import org.apache.hadoop.security.usergroupinformation;
import java.sql.connection;
import java.sql.drivermanager;
import java.sql.resultset;
import java.sql.statement;
public class hconnectimpalakerberos {
// kerberos
public static final string krb5_conf = "c:/windows/krb5.ini"; //linux中krb5.conf
public static final string principal = "normtest@hadoop.com";
public static final string keytab = "c:/windows/normtest.keytab";
public static string connectionurl = "jdbc:hive2://host:21050/;principal=impala/host@hadoop.com";
public static string jdbcdrivername = "org.apache.hive.jdbc.hivedriver";
public static void main(string[] args) throws exception {
system.setproperty("java.security.krb5.conf", krb5_conf);
configuration conf = new configuration();
conf.set("hadoop.security.authentication", "kerberos");
usergroupinformation.setconfiguration(conf);
usergroupinformation.loginuserfromkeytab(principal, keytab);
system.out.println(">> 1. login from keytab " + keytab + " success");
//加载驱动
class.forname(jdbcdrivername);
system.out.println(">> 2. jdbcdriver load success");
try (connection con = drivermanager.getconnection(connectionurl)) {
system.out.println(">> 3. login impala sussecs");
statement stmt = con.createstatement();
resultset rs = stmt.executequery("select count(1) from norm_demo");
while (rs.next()) {
system.out.println(rs.getint(1));
}
} catch (exception e) {
e.printstacktrace();
}
}
}
常见问题
java.lang.illegalargumentexception: can’t get kerberos realm
一般是因为没有找到配置文件
- 如果是windows,将 krb5.ini 和 xxx.keytab 需要放在 c:\windows\ 路径下,记得改后缀
- 如果是linux,将 krb5.conf 和 xxx.keytab 需要放在 /etc/ 路径下
gss initiate failed
kerberos认证成功后,连接impala报这个错误
一般可能是因为url填写错误了,请仔细检查url中的参数等
- 下图为官方文档示例:

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论