在我的服务器应用程序中,我从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$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)
根据这个答案,kerberos票证应该是自动续订的。
我的应用程序使用的是Java8,我遇到了这个bug。
但是看起来我的应用程序使用的hadoop-common-2.7.1.2.4.2.12-1.jar已经有了修复。源头可以在这里找到。
但仍然得到了相同的错误,因为自动更新没有发生。打电话后才解决 UserGroupInformation.checkTGTAndReloginFromkeytab()
在上面的回答中建议的每一个操作之前。但是这只是在使用RESTAPI时建议的,而不是在rpc中建议的,我希望本地JavaAPI只使用rpc。
为什么自动更新没有发生在上面的答案建议?
2条答案
按热度按时间anauzrmj1#
不幸的是,在使用时,存在一个已知的自动续订无法正常工作的问题
UserGroupInformation#loginUserFromKeytabAndReturnUGI
方法。目前我还不知道apachehadoop中有任何已知的代码修复。添加呼叫的解决方案
UserGroupInformation#checkTGTAndReloginFromKeytab
是一个可行的解决方法。我建议您现在就坚持这样做,并关注apachehadoop发行说明,看看将来是否有一个修复方案。i7uaboj42#
看起来java应用程序中使用的hadoop公共jar与服务器不匹配。请修改java应用程序以使用服务器中存在的相同版本的hadoop jars。