我有一个火花流应用程序,对于每个批次,我需要将它插入受kerberos保护的hbase。我找到了一个解决方案,就是在驱动程序端,我创建了一个连接并从该conn获取一个令牌,然后将其传递给执行者。在执行程序端,我解码它并获取令牌,这样我就可以成功地将数据插入到hbase中。这似乎很好,但我担心的是令牌会过期吗?如果是这样,请问如何解决?
我的代码段是
val ugi=UserGroupInformation.loginUserFromKeytabAndReturnUGI(principle,keytabfile);
ugi.doAs(new PrivilegedAction[Unit]() {
def run(): Unit = {
conn = ConnectionFactory.createConnection(conf)
val token = TokenUtil.obtainToken(conn)
tokenStr = token.encodeToUrlString()
}
})
val token = new Token()
token.decodeFromUrlString(tokenStr)
UserGroupInformation.getCurrentUser.addToken(token)
虽然我已经从互联网上搜索了很多关于这个问题的内容,但我没有找到关于这个问题的好解决方案。这个问题的常见答案是
UserGroupInformation.getLoginUser().checkTGTAndReloginFromKeytab();
但是作为我的测试,在这个方法中,
public synchronized void checkTGTAndReloginFromKeytab() throws IOException {
if (!isSecurityEnabled()
|| user.getAuthenticationMethod() != AuthenticationMethod.KERBEROS
|| !isKeytab)
return;
KerberosTicket tgt = getTGT();
if (tgt != null && Time.now() < getRefreshTime(tgt)) {
return;
}
reloginFromKeytab();
}
isKeytab 始终为false,因此它永远不会执行以下代码,我不明白为什么这会返回false。所以任何人都可以帮我解决这个问题?任何帮助表示赞赏!
答案 0 :(得分:0)
这是由Java版本引起的。如果要在JDK 1.7.0_85或更高版本上运行安全的Hadoop集群,则必须运行Apache Hadoop 2.7.0或更高版本。
要查看此Jira问题HADOOP-10786