kerberos 服务重启之后异常
项目中用到了hive 和hdfs ,权限认证使用了Kerberos,因为机房异常,导致了Kerberos 服务重启,结果发现本来运行正常的应用服务hive 和hdfs 认证失败,报错信息是
典型的网络连接异常
排查思路
验证Kerberos 服务
首先想到Kerberos服务异常,防火墙拦截。通过hdfs 命令发现 Kerberos 服务正常。
后边自己写了一个hive 链接测试应用,发现同一台机器上可以正常验证通过访问hive。
排查为什么拒绝链接
应用本身上线有一段时间,期间未发生这种报错,所以思路集中在配置文件,服务器hosts配置方向,后边通过自己的测试服务 正常链接排除的环境因素那么就是程序本身问题,奇怪的点事本身服务运行正常,突然报异常了。
这个就有点奇怪,之后对比了代码发现
Kerberos 配置写法导致
正确的写法
try {
Class.forName(JDBC_DRIVER);
//登录Kerberos账号
String keytabPath = "/opt/data/kerberos/" + keytab;
Configuration configuration = new Configuration();
configuration.set("hadoop.security.authentication", "Kerberos");
configuration.set("java.security.krb5.conf", "/opt/data/kerberos/krb5.conf");
UserGroupInformation.setConfiguration(configuration);
UserGroupInformation.loginUserFromKeytab(krbUser, keytabPath);
System.out.println("Kerberos 验证通过");
Connection connection = null;
ResultSet rs = null;
PreparedStatement ps = null;
try {
connection = DriverManager.getConnection(CONNECTION_URL);
ps = connection.prepareStatement("select * from ods_inc.k02_city");
rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getString(1));
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
return "exception";
}
return "finish";
}
产生异常的写法
try {
log.debug(keyTabPath);
log.debug(confPath);
//设置krb配置文件路径,注意一定要放在Configuration前面,不然不生效
System.setProperty("java.security.krb5.conf", confPath);
Configuration conf = new Configuration();
//设置认证模式Kerberos
conf.set("hadoop.security.authentication", "Kerberos");
UserGroupInformation.setConfiguration(conf);
//设置认证用户和krb认证文件路径
UserGroupInformation.loginUserFromKeytab(krbUser, keyTabPath);
log.info("Kerberos 验证成功");
} catch (Exception e) {
e.printStackTrace();
log.error("Kerberos 验证失败", e);
throw new PluginException("Kerberos 验证失败", e);
}
关键点是
System.setProperty(“java.security.krb5.conf”, confPath);
这个配置文件在Kerberos 服务重启之后不生效了。
至于为什么不生效,欢迎高手一起研究交流。
总结
Kerberos 服务认证 内嵌在jdk中,某些jdk版本会导致Kerberos 认证异常,Kerberos 认证抛出的异常信息不足,很多时候排查问题比较耗费时间甄别,这种突然爆出的异常 应该和程序初始化有关系,或者Kerberos 服务重启之后的某些因素影响。
问题比较罕见,如果应用服务中环境可以通过防火墙策略配置,不建议使用Kerberos 认真大数据组件。