hbase kerberos令牌是否过期

dddzy1tm  于 2021-06-08  发布在  Hbase
关注(0)|答案(1)|浏览(408)

我有一个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。有人能帮我解决这个问题吗?感谢您的帮助!

bvhaajcl

bvhaajcl1#

它是由java版本引起的。如果您想在JDK1.7.0\U85或更高版本上运行安全的hadoop群集,那么必须运行ApacheHadoop2.7.0或更高版本。
看看这个jira版本hadoop-10786

相关问题