2014-05-09 2 views
3

안녕하세요 보안 hbase 용 Java 클라이언트를 작성하려고합니다. 나는 usergroup 정보 클래스를 사용하여 코드 자체에서 kinit을하고 싶다. 어디서 잘못 알 수 있습니까?보안 Hbase 용 Java 클라이언트

이것은 내가 hbase에서 연결을 시도하는 주요 방법입니다.

클라이언트를 어디서나 위치시킬 수 있기 때문에 xml을 사용하는 대신 Configing 개체에 구성을 추가해야합니다.

아래의 코드를 참조하십시오

public static void main(String [] args) { 
    try { 
     System.setProperty(CommonConstants.KRB_REALM, ConfigUtil.getProperty(CommonConstants.HADOOP_CONF, "krb.realm")); 
     System.setProperty(CommonConstants.KRB_KDC, ConfigUtil.getProperty(CommonConstants.HADOOP_CONF,"krb.kdc")); 
     System.setProperty(CommonConstants.KRB_DEBUG, "true"); 

     final Configuration config = HBaseConfiguration.create(); 

     config.set(CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHENTICATION, AUTH_KRB); 
     config.set(CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHORIZATION, AUTHORIZATION); 
     config.set(CommonConfigurationKeysPublic.FS_AUTOMATIC_CLOSE_KEY, AUTO_CLOSE); 
     config.set(CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY, defaultFS); 
     config.set("hbase.zookeeper.quorum", ConfigUtil.getProperty(CommonConstants.HBASE_CONF, "hbase.host")); 
     config.set("hbase.zookeeper.property.clientPort", ConfigUtil.getProperty(CommonConstants.HBASE_CONF, "hbase.port")); 
     config.set("hbase.client.retries.number", Integer.toString(0)); 
     config.set("zookeeper.session.timeout", Integer.toString(6000)); 
     config.set("zookeeper.recovery.retry", Integer.toString(0)); 
     config.set("hbase.master", "gauravt-namenode.pbi.global.pvt:60000"); 
     config.set("zookeeper.znode.parent", "/hbase-secure"); 
     config.set("hbase.rpc.engine", "org.apache.hadoop.hbase.ipc.SecureRpcEngine"); 
     config.set("hbase.security.authentication", AUTH_KRB); 
     config.set("hbase.security.authorization", AUTHORIZATION); 
     config.set("hbase.master.kerberos.principal", "hbase/[email protected]"); 
     config.set("hbase.master.keytab.file", "D:/var/lib/bda/secure/keytabs/hbase.service.keytab"); 
     config.set("hbase.regionserver.kerberos.principal", "hbase/[email protected]"); 
     config.set("hbase.regionserver.keytab.file", "D:/var/lib/bda/secure/keytabs/hbase.service.keytab"); 

     UserGroupInformation.setConfiguration(config); 
     UserGroupInformation userGroupInformation = UserGroupInformation.loginUserFromKeytabAndReturnUGI("hbase/[email protected]", "D:/var/lib/bda/secure/keytabs/hbase.service.keytab"); 
     UserGroupInformation.setLoginUser(userGroupInformation); 

     User user = User.create(userGroupInformation); 

     user.runAs(new PrivilegedExceptionAction<Object>() { 

      @Override 
      public Object run() throws Exception { 
       HBaseAdmin admins = new HBaseAdmin(config); 

       if(admins.isTableAvailable("ambarismoketest")) { 
        System.out.println("Table is available"); 
       }; 

       HConnection connection = HConnectionManager.createConnection(config); 

       HTableInterface table = connection.getTable("ambarismoketest"); 



       admins.close(); 
       System.out.println(table.get(new Get(null))); 
       return table.get(new Get(null)); 
      } 
     }); 
     System.out.println(UserGroupInformation.getLoginUser().getUserName()); 


    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

난`은 다음과 같은 예외를 받고 :

Caused by: org.apache.hadoop.ipc.RemoteException(javax.security.sasl.SaslException): GSS initiate failed 
at org.apache.hadoop.hbase.security.HBaseSaslRpcClient.readStatus(HBaseSaslRpcClient.java:110) 
at org.apache.hadoop.hbase.security.HBaseSaslRpcClient.saslConnect(HBaseSaslRpcClient.java:146) 
at org.apache.hadoop.hbase.ipc.RpcClient$Connection.setupSaslConnection(RpcClient.java:762) 
at org.apache.hadoop.hbase.ipc.RpcClient$Connection.access$600(RpcClient.java:354) 
at org.apache.hadoop.hbase.ipc.RpcClient$Connection$2.run(RpcClient.java:883) 
at org.apache.hadoop.hbase.ipc.RpcClient$Connection$2.run(RpcClient.java:880) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Subject.java:396) 
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491) 
at org.apache.hadoop.hbase.ipc.RpcClient$Connection.setupIOstreams(RpcClient.java:880) 
... 33 more 

모든 포인터가 도움이 될 것입니다.

+0

GSSAPI 구현으로 실행 해 보았습니다. 아직 성공하지 못했습니다. ( –

답변

4

여전히 도움이 필요한지 잘 모르겠습니다. "hadoop.security.authentication"속성을 설정하는 것이 스 니펫에서 빠져 있다고 생각합니다.

다음 코드 스 니펫을 사용하여 보안 HBase (CDH5)에 연결합니다. 시도해 볼 수 있습니다.

config.set("hbase.zookeeper.quorum", zookeeperHosts); 
config.set("hbase.zookeeper.property.clientPort", zookeeperPort); 
config.set("hadoop.security.authentication", "kerberos"); 
config.set("hbase.security.authentication", "kerberos"); 
config.set("hbase.master.kerberos.principal", HBASE_MASTER_PRINCIPAL); 
config.set("hbase.regionserver.kerberos.principal", HBASE_RS_PRINCIPAL); 

UserGroupInformation.setConfiguration(config); 
UserGroupInformation.loginUserFromKeytab(ZOOKEEPER_PRINCIPAL,ZOOKEEPER_KEYTAB); 

HBaseAdmin admins = new HBaseAdmin(config); 
TableName[] tables = admins.listTableNames(); 

for(TableName table: tables){ 
    System.out.println(table.toString()); 
} 
+1

전체 작업 코드 또는 Github 링크를 공유 할 수 있습니까? –

3

위의 내용은 훌륭하게 작동하지만 구성 개체의 모든 올바른 속성을 설정하는 데 많은 어려움을 겪고 있습니다. 실제로 필요로하는 것과 필요하지 않은 것의 사실상의 목록은 없으며 클러스터 구성에 힘들어합니다.

확실한 방법은 classpath에 HBase 구성을 복사하는 것입니다. 클라이언트가 언급 한대로 어디서든 사용할 수 있기 때문입니다. 그런 다음 모든 속성을 지정하지 않고도 개체에 리소스를 추가 할 수 있습니다. Scalding (Scala)

는 또한,이 방법은 실제로 내부 사육사의 원금과 키 탭을 사용하도록 제한하지 않습니다 당신이 keytabs을 만들 수 있습니다 즉, IBM : 여기

Configuration conf = HBaseConfiguration.create(); 
conf.addResource("core-site.xml"); 
conf.addResource("hbase-site.xml"); 
conf.addResource("hdfs-site.xml"); 

이 방법을 백업하는 몇몇 근원이었다 응용 프로그램이나 Active Directory 사용자는 데몬이 자체적으로 인증 할 수 있도록 내부적으로 생성 된 키탭을 그대로 두십시오.

관련 문제