开发者社区 问答 正文

java连接hbase开启kerberos失败

之前用java连接hbase是没有启动Kerberos认证,代码能连接到hbase,也能查询数据;现在启动kerberos认证后再次查询时却不能获取到数据
以下是我的代码,大牛们有知道哪儿出问题了(hbase是基于CDH5.13版本开发的)

                    System.setProperty("hadoop.home.dir", "/usr/hbase");
        conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.property.clientPort", zkPort); 
        conf.set("hbase.zookeeper.quorum", zkHost);
        conf.set("hbase.master", master);
        conf.set("hbase.master.kerberos.principal","hbase/_HOST@TEST.COM");        
        conf.set("hbase.regionserver.kerberos.principal","hbase/_HOST@TEST.COM");        
        conf.set("hbase.security.authentication","kerberos");
        conf.addResource("/usr/hbase/hbase-site.xml");
        String principal = System.getProperty("kerberosPrincipal", "hbase@TEST.COM");
        String keytabLocation = System.getProperty("kerberosKeytab",keyberos);
        UserGroupInformation.setConfiguration(conf);
        UserGroupInformation ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI(principal, keytabLocation);
        ugi.reloginFromKeytab();
        conn = ConnectionFactory.createConnection(conf);

问题现象:开启认证后服务器能正常启动,也不报错。但是在查询中就出现以下错误信息:
DEBUG ResultBoundedCompletionService:226 - Replica 0 returns java.net.SocketTimeoutException: callTimeout=60000,

              callDuration=72022: Call to bdp02/10.127.60.2:60020 failed on local exception: javax.security.sasl.SaslException:    
              Failure to initialize security context [Caused by GSSException: Invalid name provided (Mechanism level: KrbException: 
              Cannot locate default realm)] row 'hbase_person_ecif,6610fc0ad0d6745f39310624bfe761ad,99999999999999' on 
             table 'hbase:meta' at region=hbase:meta,,1.1588230740, hostname=bdp02,60020,1542464877235, seqNum=0

DEBUG ConnectionImplementation:911 - locateRegionInMeta parentTable=hbase:meta, metaLocation=, attempt=0 of 36 failed;

             retrying after sleep of 100 because: Failed after attempts=36, exceptions:
             Sat Nov 17 22:53:32 CST 2018, null, java.net.SocketTimeoutException: callTimeout=60000, callDuration=72022: Call to 
             bdp02/10.127.60.2:60020 failed on local exception: javax.security.sasl.SaslException: Failure to initialize security 
             context [Caused by GSSException: Invalid name provided (Mechanism level: KrbException: Cannot locate default 
             realm)] row 'hbase_person_ecif,6610fc0ad0d6745f39310624bfe761ad,99999999999999' on table 'hbase:meta' at 
             region=hbase:meta,,1.1588230740, hostname=bdp02,60020,1542464877235, seqNum=0

展开
收起
叫我鹏爷 2018-11-17 23:20:57 9002 分享
分享
版权
举报
阿里云 AI 助理回答

从错误信息来看,问题出在Kerberos认证过程中无法初始化安全上下文(SaslException: Failure to initialize security context),具体原因为找不到默认的realm(GSSException: Invalid name provided (Mechanism level: KrbException: Cannot locate default realm))。这通常意味着你的Kerberos配置中缺少了对默认realm的正确指定或者Kerberos环境没有被正确设置。

请检查以下几个方面:

  1. 确保krb5.conf文件配置正确:这个文件定义了Kerberos的域(realm)信息、KDC服务器地址等关键参数。你需要确认该文件中包含了正确的default realm,并且与你的principal中的realm相匹配。同时,确保Hadoop和HBase能够访问到这个配置文件。如果不在标准路径下,可能需要通过系统属性或环境变量指定其位置。

  2. 环境变量和系统属性:确认环境变量KRB5_CONFIG指向了正确的krb5.conf文件路径。此外,你已经在代码中设置了hbase.master.kerberos.principalhbase.regionserver.kerberos.principal,但也要确保这些principal名称完全符合Kerberos数据库中的条目,包括正确的主机名和realm。

  3. Keytab文件:确保你使用的keytab文件是正确的,且包含有对应principal的密钥。同时,keytab文件的权限应该设置得足够安全(例如,只允许属主读取)。

  4. Java环境的Kerberos配置:有时候,即使系统级别的Kerberos配置正确,Java应用可能还是不能正确加载这些配置。你可以尝试在启动Java应用时显式地指定Kerberos相关的系统属性,比如 -Djava.security.krb5.conf=/path/to/krb5.conf

  5. 网络和防火墙:虽然错误主要集中在Kerberos认证上,但是网络问题也可能导致连接失败。确保没有防火墙规则阻止了客户端到HBase服务的通信。

  6. 时间同步:Kerberos对时间敏感,确保所有涉及的服务器(包括客户端)的时间同步准确,最好使用NTP服务进行时间同步。

综上所述,首先应重点检查Kerberos的配置是否完整且正确,特别是realm的定义以及keytab文件的有效性。如果以上步骤都确认无误,那么可能需要查看更详细的日志或者考虑是否有其他安全策略(如SELinux)影响了操作。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等