我有一个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并结合上面的javaapi才能使代码正常工作?或者运行一次就足够了?或者根本不需要。
谢谢你的阅读。
2条答案
按热度按时间j13ufse21#
这是一个漫长而复杂的故事。简而言之:
如果显式请求hadoop auth库创建私有kerberos票证
loginUserFromKeytab()
,则该票不可续签;必须启动后台线程才能调用checkTGTAndReloginFromKeytab()
它会不时地重新创建一张快过期的票否则,ugi将隐式读取共享票证缓存以获取现有票证;它还会隐式地启动一个后台线程来自动续订该票证(只要它没有到达续订时间的末尾——此时您就完蛋了)
一些推荐读物:
-hbase kerberos连接更新策略
-我应该在hadoop上的每个操作之前调用ugi.checktgtandreloginfromkeytab()吗?
-自动更新kerberos票证在java中不起作用(即ugi的非静态方法中有一个bug)
xytpbqjk2#
不,你不需要跑
kinit
如果您正在使用函数,则可以从任何位置定期执行loginUserFromKeytab
使用有效的keytab和用户名。来自文档
从keytab文件登录用户。从keytab文件加载用户标识并将其登录。他们将成为当前登录的用户。
所以每次你调用这个方法
loginUserFromKeytab
使用有效参数。它登录用户。