La renovación automática del ticket Kerberos no funciona desde Java

En mi aplicación de servidor, me estoy conectando al clúster Hadoop seguro de Kerberos desde mi aplicación java. En el inicio de la aplicación llamo

UserGroupInformation.loginUserFromKeytabAndReturnUGI( ... );

Estoy haciendo operaciones básicas de archivos usando nativoFileSystem API comoFileSystem.exists() yFileSystem.delete()

Mi aplicación arroja el siguiente error después de 24H. Ese es el vencimiento del boleto 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 respuesta, el ticket Kerberos debe renovarse automáticamente.

Mi aplicación está usando Java 8 y me encontréeste error.

Pero luego parece que elhadoop-common-2.7.1.2.4.2.12-1.jar utilizado por mi aplicación ya tiene la solución. La fuente se puede encontraraquí.

Pero todavía recibí el mismo error ya que la renovación automática no estaba ocurriendo. Se resolvió solo después de llamarUserGroupInformation.checkTGTAndReloginFromkeytab() antes de cada acción como se sugiere en lo anteriorresponder Pero eso se sugirió solo cuando se usan las API Rest y no para las RPC y espero que las API Java nativas usen solo RPC.

¿Por qué no se realiza la renovación automática como se sugiere en lo anterior?responder?

Respuestas a la pregunta(2)

Su respuesta a la pregunta