我有一个spark流应用程序,对于每个批,我需要将它插入到受kerberos保护的hbase中。我找到了一个解决方案,在驱动端我创建了一个连接,并从该连接获取一个令牌,然后将其传递给执行器。在executor端,我对它进行解码并得到令牌,这样就可以成功地将数据插入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()
}
})
在rdd.foreachpartition中,
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。有人能帮我解决这个问题吗?感谢您的帮助!
1条答案
按热度按时间bvhaajcl1#
它是由java版本引起的。如果您想在JDK1.7.0\U85或更高版本上运行安全的hadoop群集,那么必须运行ApacheHadoop2.7.0或更高版本。
看看这个jira版本hadoop-10786