通过Java代码访问Kerberized服务时是否需要kinit?

时间:2017-06-05 05:16:04

标签: java hadoop kerberos

我有一个java应用程序需要访问Hadoop集群以定期获取文件(例如,每24小时)。

由于Kerberos协议已在该群集上启用保护,因此我使用UserGroupInformation类的loginUserFromKeytab()方法:https://hadoop.apache.org/docs/r1.2.1/api/org/apache/hadoop/security/UserGroupInformation.html

现在,我知道kinit命令授予访问任何Kerberized服务的票证授予票证,并且必须定期刷新此票证(通过kinit命令)。现在,我的问题是,是否需要定期运行kinit(从代码中)与上述Java API结合运行代码?或者一次运行就足够了?或者根本不需要。

感谢阅读。

2 个答案:

答案 0 :(得分:3)

没有。如果您使用具有有效密钥表和用户名的函数kinit,则不需要定期从任何地方运行loginUserFromKeytab

来自docs

  

从keytab文件中记录用户。从keytab文件加载用户标识并将其登录。它们将成为当前登录的用户。

因此,每次使用有效参数调用方法loginUserFromKeytab时。它登录用户。

答案 1 :(得分:3)

这是一个漫长而复杂的故事。简而言之:

  • 如果您请求显式 Hadoop auth库以创建带有loginUserFromKeytab()私有 Kerberos票证,则该票证不可续订;你必须不时启动一个后台线程来调用checkTGTAndReloginFromKeytab(),它会在它到期时重新创建它
  • 否则UGI将隐式读取共享票证缓存以获取现有票证;并且它还会隐式启动后台线程,以自动续订该票证(只要它没有达到续订时间 - 此时你就被搞砸了)

一些推荐读物:
  - HBase Kerberos connection renewal strategy
  - Should I call ugi.checkTGTAndReloginFromKeytab() before every action on hadoop?
  - Auto renewal of Kerberos ticket not working from Java (即UGI的非静态方法存在错误)