2017-01-03 7 views
3

나는 hbase 테이블에서 put/delete/get과 같은 기본 기능을 제공하는 작은 스프링 서비스를 제공합니다. 모든 것이 작동하는 것처럼 보이지만 한 가지 문제가 있습니다. My Tomcat 서버를 시작한 후 10 시간이 지나면 내 kerberos 티켓이 만료되므로 갱신해야합니다.HBase에서 만료되는 Kerberos 티켓을 갱신하는 방법은 무엇입니까?

UserGroupInformation.getLoginUser().reloginFromKeytab() 

과 :

SecurityUtil.login(configuration, keytabFilePath, kerberosUser) 
내가 함께도 시도

UserGroupInformation.getLoginUser().checkTGTAndReloginFromKeytab(); 

: 나는이 줄을 추가 HBase를과 HBase를 연결하는 모든 방법, 내 코드에서 자바 API를 사용하려고

하지만 도움이되지 않습니다 나는이 예외를 서버를 다시 시작 10 시간이 경과 된 후 얻을 :

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(Unknown Source) 
at org.apache.hadoop.hbase.security.HBaseSaslRpcClient.saslConnect(HBaseSaslRpcClient.java:179) 
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.setupSaslConnection(RpcClientImpl.java:617) 
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.access$700(RpcClientImpl.java:162) 
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection$2.run(RpcClientImpl.java:743) 
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection$2.run(RpcClientImpl.java:740) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Unknown Source) 
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1614) 
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.setupIOstreams(RpcClientImpl.java:740) 
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.writeRequest(RpcClientImpl.java:906) 
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.tracedWriteRequest(RpcClientImpl.java:873) 
at org.apache.hadoop.hbase.ipc.RpcClientImpl.call(RpcClientImpl.java:1241) 
at org.apache.hadoop.hbase.ipc.AbstractRpcClient.callBlockingMethod(AbstractRpcClient.java:227) 
at org.apache.hadoop.hbase.ipc.AbstractRpcClient$BlockingRpcChannelImplementation.callBlockingMethod(AbstractRpcClient.java:336) 
at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$BlockingStub.multi(ClientProtos.java:34142) 
at org.apache.hadoop.hbase.client.MultiServerCallable.call(MultiServerCallable.java:128) 
at org.apache.hadoop.hbase.client.MultiServerCallable.call(MultiServerCallable.java:53) 
at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithoutRetries(RpcRetryingCaller.java:210) 
at org.apache.hadoop.hbase.client.AsyncProcess$AsyncRequestFutureImpl$SingleServerRequestRunnable.run(AsyncProcess.java:733) 
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) 
at java.util.concurrent.FutureTask.run(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

내가 로그도 발견이 몇 줄 :

2017-01-03 19:09:16 DEBUG UserGroupInformation:1638 - PrivilegedAction as:[email protected] (auth:KERBEROS) from:org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.setupIOstreams(RpcClientImpl.java:740) 
2017-01-03 19:09:16 DEBUG UserGroupInformation:1618 - PrivilegedActionException as:[email protected] (auth:KERBEROS) cause:javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)] 
2017-01-03 19:09:16 DEBUG UserGroupInformation:1638 - PrivilegedAction as:[email protected] (auth:KERBEROS) from:org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.handleSaslConnectionFailure(RpcClientImpl.java:643) 
2017-01-03 19:09:16 WARN UserGroupInformation:1113 - Not attempting to re-login since the last re-login was attempted less than 600 seconds before. 

모든 안타 또는 내가 뭘 잘못했는지 팁?

편집 : 내가 Kerberos를 사용하여 인증 코드를 사용

Configuration configuration = HBaseConfiguration.create(); 
configuration.addResource("some config file"); 
UserGroupInformation.setConfiguration(configuration); 
UserGroupInformation.loginUserFromKeytab(kerberosUser, keytabFilePath); 

내가 내 프로젝트에서 2.6.5로 하둡 종속성 버전을 변경합니다.

+0

해결책을 아직 사용해 보지 않으셨습니까? http://stackoverflow.com/a/34691071/2443502? Hadoop과 관련이 있지만 Hbase은 Hdoop의 보안 API를 사용하므로 한 번 사용해보십시오. –

+0

옙, 제 경우에는 솔루션은 다음과 같이 보일 것입니다 : http://stackoverflow.com/questions/33211134/hbase-kerberos-connection-renewal-strategy/33243360#33243360. – Marcin

+1

또한 확인하십시오. http://stackoverflow.com/questions/41087997/auto-renewal-of-kerberos-ticket-not-working-from-java * (기본 UGI를 사용하지 않는 경우) * 및 주석 http://stackoverflow.com/questions/38213377/hbasekerberos-usergroupinformation-logging-in-from-keytab-expires * (예 : "relogin"은 먼저 "로그인"해야합니다!) * –

답변

1

효과가있는 최종 해결책 : 1. Hadoop 종속성을 hadoop-maphduce-client-core, hadoop-common 인 2.6.5 버전으로 업그레이드하십시오. 2. 5-6 분마다 코드를 실행하는 간단한 스케줄러를 만듭니다. 3. HBase 데이터베이스를 사용할 때마다 아래의 코드를 실행하십시오.

UserGroupInformation.getLoginUser().checkTGTAndReloginFromKeytab();