A renovação automática do tíquete Kerberos não está funcionando no Java
No meu aplicativo de servidor, estou me conectando ao cluster Hadoop protegido por Kerberos do meu aplicativo java. Na inicialização do aplicativo eu chamo
UserGroupInformation.loginUserFromKeytabAndReturnUGI( ... );
Estou executando operações básicas de arquivos usando nativoFileSystem
API comoFileSystem.exists()
eFileSystem.delete()
Meu aplicativo lança o seguinte erro após 24H. Essa é a validade do bilhete 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)
Deesta resposta, o tíquete Kerberos deve ser renovado automaticamente.
Minha aplicação está usando Java 8 e me depareiesse bug.
Mas então se parece com ohadoop-common-2.7.1.2.4.2.12-1.jar usado pelo meu aplicativo já tem a correção. A fonte pode ser encontradaaqui.
Mas ainda assim recebi o mesmo erro que a renovação automática não estava acontecendo. Foi resolvido apenas depois de ligarUserGroupInformation.checkTGTAndReloginFromkeytab()
antes de cada ação, conforme sugerido acimaresponda .Mas isso foi sugerido apenas ao usar APIs Rest e não para RPCs, e espero que as APIs Java nativas usem apenas RPC.
Por que a renovação automática não está acontecendo, conforme sugerido acimaresponda?