自动续订Kerberos票证无法使用Java

时间:2016-12-11 15:50:12

标签: java hadoop kerberos

在我的服务器应用程序中,我从我的java应用程序连接到Kerberos安全的Hadoop集群。在应用程序启动时,我打电话

UserGroupInformation.loginUserFromKeytabAndReturnUGI( ... );

我使用FileSystemFileSystem.exists()等原生FileSystem.delete() API进行基本文件操作

我的应用程序在24小时后抛出以下错误。这是Kerberos票证的到期日。

Caused by: java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
        at org.apache.hadoop.ipc.Client$Connection$1.run(Client.java:690)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1709)
        at org.apache.hadoop.ipc.Client$Connection.handleSaslConnectionFailure(Client.java:653)
        at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:740)
        at org.apache.hadoop.ipc.Client$Connection.access$2900(Client.java:378)
        at org.apache.hadoop.ipc.Client.getConnection(Client.java:1492)
        at org.apache.hadoop.ipc.Client.call(Client.java:1402)
        ... 27 more
Caused by: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
        at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:211)
        at org.apache.hadoop.security.SaslRpcClient.saslConnect(SaslRpcClient.java:413)
        at org.apache.hadoop.ipc.Client$Connection.setupSaslConnection(Client.java:563)

this回答,应该自动续订Kerberos票证。

我的应用程序使用的是Java 8,我遇到了this bug

但是看起来我的应用程序使用的hadoop-common-2.7.1.2.4.2.12-1.jar已经有了修复。可以找到来源here

但仍然出现了与自动更新未发生相同的错误。只有在按照上面UserGroupInformation.checkTGTAndReloginFromkeytab()的建议在每个操作之前调用answer之后才解决它。但是只有在使用Rest API而不是RPC时才会建议它,我希望本机Java API仅使用RPC。

为什么自动续订不会按上述answer中的建议进行?

2 个答案:

答案 0 :(得分:1)

不幸的是,使用UserGroupInformation#loginUserFromKeytabAndReturnUGI方法时,自动续订无法正常运行存在已知问题。我目前还不知道Apache Hadoop中有任何已知的代码修复。

您向UserGroupInformation#checkTGTAndReloginFromKeytab添加呼叫的解决方案是一种可行的解决方法。我建议您暂时坚持使用它,并密切关注Apache Hadoop发行说明,看看将来是否有修复程序。

答案 1 :(得分:0)

看起来你的java应用程序中使用的hadoop-common jar与服务器不匹配。请修改您的java应用程序以使用服务器中存在的相同版本的hadoop jar。