从windows连接到kerberized hbase:未能指定服务器的kerberos主体名称

cwxwcias  于 2021-06-10  发布在  Hbase
关注(0)|答案(1)|浏览(372)

下面是我使用kerberos连接到hbase的代码:

  1. Configuration conf = HBaseConfiguration.create();
  2. conf.set("hbase.zookeeper.quorum", "20.20.100.1");
  3. conf.set("hbase.zookeeper.property.clientPort", "2181");
  4. final String USER_KEY = "appuser.principal";
  5. final String KEYTAB_KEY = "appuser.keytab.filename";
  6. final String Key_user = Config.getProperties().getString("kerberos_keyuser");
  7. final String Key_tab = Config.getProperties().getString("kerberos_keytab");
  8. conf.set("hadoop.security.authentication", "kerberos");
  9. conf.set("hbase.security.authentication", "kerberos");
  10. conf.set(USER_KEY, Key_user);
  11. conf.set(KEYTAB_KEY, Key_tab);
  12. SecurityUtil.login(conf, KEYTAB_KEY, USER_KEY);
  13. Connection connection = ConnectionFactory.createConnection(conf);
  14. try (Table table = connection.getTable(TableName.valueOf("newssentiment:test"))) {
  15. Scan scan = new Scan();
  16. ResultScanner scanner = table.getScanner(scan);
  17. Iterator<Result> iterator = scanner.iterator();
  18. System.out.println();
  19. while(iterator.hasNext()) {
  20. System.out.println(iterator.next());
  21. }
  22. }
  23. catch (Exception e){
  24. System.out.print(e.getMessage());
  25. }
  26. HBaseAdmin.checkHBaseAvailable(conf);
  27. connection.close();
  28. System.out.println("HBase is running!");

但我有以下错误:

  1. org.apache.hadoop.security.UserGroupInformation - PriviledgedActionException as:u8000 (auth:SIMPLE) cause:java.io.IOException: Failed to specify server's Kerberos principal name
  2. org.apache.hadoop.hbase.ipc.AbstractRpcClient - Exception encountered while connecting to the server : java.io.IOException: Failed to specify server's Kerberos principal name
  3. org.apache.hadoop.security.UserGroupInformation - PriviledgedActionException as:u8000 (auth:SIMPLE) cause:java.io.IOException: java.io.IOException: Failed to specify server's Kerberos principal name

同样的代码可以在linux上成功运行,但在windows上总是失败。

fcg9iug3

fcg9iug31#

只要替换一下 SecurityUtil.login(conf, KEYTAB_KEY, USER_KEY);

  1. UserGroupInformation.setConfiguration(conf);
  2. UserGroupInformation.loginUserFromKeytab("USER_KEY", KEYTAB_KEY);

为简单起见,您可以按以下方式编写代码:

  1. Configuration conf = HBaseConfiguration.create();
  2. conf.addResource(new Path("D:\\core-site.xml");
  3. conf.addResource(new Path("D:\\hbase-site.xml");
  4. System.setProperty( "java.security.krb5.conf", "D:\\krb5.conf");
  5. // give the path of krb5.conf file
  6. UserGroupInformation.setConfiguration(conf);
  7. UserGroupInformation.loginUserFromKeytab("Dummy@EXAMPLE.COM", "D:\\farooque.keytab");
  8. // Dummy@EXAMPLE.COM is the principal name, give the path of keytab file
  9. Connection connection = ConnectionFactory.createConnection(conf);
  10. try (Table table = connection.getTable(TableName.valueOf("newssentiment:test"))) {
  11. Scan scan = new Scan();
  12. ResultScanner scanner = table.getScanner(scan);
  13. Iterator<Result> iterator = scanner.iterator();
  14. System.out.println();
  15. while(iterator.hasNext()) {
  16. System.out.println(iterator.next());
  17. }
  18. }
  19. catch (Exception e){
  20. System.out.print(e.getMessage());
  21. }
  22. HBaseAdmin.checkHBaseAvailable(conf);
  23. connection.close();
  24. System.out.println("HBase is running!");

如果以上代码成功运行,您可以用变量替换固定值。

展开查看全部

相关问题