Kerberos 票据的自动续订从 Java 开始不起作用
Auto renewal of Kerberos ticket not working from Java
在我的服务器应用程序中,我从我的 java 应用程序连接到 Kerberos 安全的 Hadoop 集群。在应用程序启动时,我会调用
UserGroupInformation.loginUserFromKeytabAndReturnUGI( ... );
我正在使用本机 FileSystem
API 进行基本文件操作,例如 FileSystem.exists()
和 FileSystem.delete()
我的应用程序在 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.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.access00(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)
根据 的回答,Kerberos 票证应该自动更新。
我的应用程序正在使用 Java 8,我遇到了 this bug。
但后来看起来像 hadoop-common-2.7.1.2.4.2.12-1.jar used by my application already has the fix. The source can be found here。
但仍然出现相同的错误,因为自动续订没有发生。它仅在调用 UserGroupInformation.checkTGTAndReloginFromkeytab()
before each action as suggested in the above 后才得到解决。但仅在使用 Rest APIs 而不是 RPC 时才建议这样做,我希望本机 Java APIs 仅使用 RPC。
为什么没有按照上面的建议进行自动续订?
不幸的是,使用 UserGroupInformation#loginUserFromKeytabAndReturnUGI
方法时,自动续订无法正常工作是一个已知问题。目前我不知道 Apache Hadoop 中有任何已知的代码修复。
您添加对 UserGroupInformation#checkTGTAndReloginFromKeytab
的调用的解决方案是一个可行的解决方法。我建议您暂时坚持使用它并密切关注 Apache Hadoop 发行说明,看看将来是否有修复。
看起来您的 java 应用程序中使用的 hadoop-common jar 与服务器不匹配。请修改您的 java 应用程序以使用服务器中存在的相同版本的 hadoop jar。
在我的服务器应用程序中,我从我的 java 应用程序连接到 Kerberos 安全的 Hadoop 集群。在应用程序启动时,我会调用
UserGroupInformation.loginUserFromKeytabAndReturnUGI( ... );
我正在使用本机 FileSystem
API 进行基本文件操作,例如 FileSystem.exists()
和 FileSystem.delete()
我的应用程序在 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.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.access00(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)
根据
我的应用程序正在使用 Java 8,我遇到了 this bug。
但后来看起来像 hadoop-common-2.7.1.2.4.2.12-1.jar used by my application already has the fix. The source can be found here。
但仍然出现相同的错误,因为自动续订没有发生。它仅在调用 UserGroupInformation.checkTGTAndReloginFromkeytab()
before each action as suggested in the above
为什么没有按照上面的建议进行自动续订
不幸的是,使用 UserGroupInformation#loginUserFromKeytabAndReturnUGI
方法时,自动续订无法正常工作是一个已知问题。目前我不知道 Apache Hadoop 中有任何已知的代码修复。
您添加对 UserGroupInformation#checkTGTAndReloginFromKeytab
的调用的解决方案是一个可行的解决方法。我建议您暂时坚持使用它并密切关注 Apache Hadoop 发行说明,看看将来是否有修复。
看起来您的 java 应用程序中使用的 hadoop-common jar 与服务器不匹配。请修改您的 java 应用程序以使用服务器中存在的相同版本的 hadoop jar。