添加依赖:
<dependency>
<groupId>com.cloudera.impala</groupId>
<artifactId>jdbc</artifactId>
<version>2.5.31</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.4.2</version>
</dependency>
</dependencies>`
示例代码:
public static void main(String[] args) throws Exception {
Class.forName("com.cloudera.impala.jdbc41.Driver");
String host = "xxxx";
String port = ""xxxx";
String database = "xxx";
String securityHost = "xxx";
final String url = String.format("jdbc:impala://%s:%s/%s;AuthMech=1;KrbHostFQDN=%s;KrbServiceName=impala", host, port, database, securityHost);
final String keytabPath = ""xxxx.keytab";
String kerberosUser = ""xxxx";
String domain=""xxxx";
loginKerberos(keytabPath,kerberosUser,domain);
UserGroupInformation loginUser = UserGroupInformation.getLoginUser();
loginUser.checkTGTAndReloginFromKeytab();
int result = loginUser.doAs(new PrivilegedAction<Integer>(){
@Override
public Integer run() {
int result = 0;
try {
Connection connection = DriverManager.getConnection(url);
PreparedStatement preparedStatement = connection.prepareStatement("select count(1) from test ");
ResultSet rs = preparedStatement.executeQuery();
while(rs.next()) {
result = rs.getInt(1);
}
connection.close();
} catch (Exception ee) {
ee.printStackTrace();
}
return result;
}
});
System.out.println(result);
}
public static void loginKerberos(String keytabFilePath, String user, String domain) throws IOException {
Configuration conf = new Configuration();
conf.set("hdfs.keytab.file", keytabFilePath);
conf.set("hdfs.kerberos.principal", user);
conf.set("hadoop.security.authentication", UserGroupInformation.AuthenticationMethod.KERBEROS.toString().toLowerCase());
SecurityUtil.setAuthenticationMethod(UserGroupInformation.AuthenticationMethod.KERBEROS, conf);
UserGroupInformation.setConfiguration(conf);
if (UserGroupInformation.isSecurityEnabled()) {
SecurityUtil.login(conf,"hdfs.keytab.file", "hdfs.kerberos.principal");
}
}
需要注意的是,如果在windows环境下,需要在C:\Windows
下配置krb5.ini
文件,Linux下在/etc
下配置krb5.conf