6

我需要编写自定义 UDF 以从 Hbase Table 查找数据。

注意:我已经使用 HIVE 进行了单元测试。它似乎正在工作。

但是当我使用相同的 UDF 直线时,它失败了。默认情况下,Cloudera 限制模拟,只允许 hive 用户在 Beeline 中运行查询。在 Job 启动时,YarnChild 正在设置以下委托令牌。

我想添加令牌(种类:HBASE_AUTH_TOKEN)来处理 Hbase。

Kind: mapreduce.job
Kind: HDFS_DELEGATION_TOKEN 
Kind: kms-dt

我研究并发现了 HbaseStorageHandler 如何为 Hbase 使用委托令牌(即 HBASE_AUTH_TOKEN)。所以我使用了相同的功能集,但它也不起作用。

来自 HbasestorageHandler 的函数(获取 Job 的令牌):

private void addHBaseDelegationToken(Configuration conf, JobConf jconf) throws IOException {
        if (User.isHBaseSecurityEnabled(conf)) {
            try {
                logger.info("isHbaseSecurityEnabled :True ");
                User e = User.getCurrent();
                logger.info("isHbaseSecurityEnabled :User ==> " + e.toString());
                Token authToken = getAuthToken(conf, e);
                logger.info("isHbaseSecurityEnabled :AuthToken==> "+authToken.toString());
                Job job = new Job(conf);
                if(authToken == null) {
                    UserGroupInformation ugi = UserGroupInformation.getLoginUser();
                    ugi.setAuthenticationMethod(UserGroupInformation.AuthenticationMethod.KERBEROS);
                    e.obtainAuthTokenForJob(jconf);
  } else {
                    logger.info("authToken is not null"+authToken.toString());
                    job.getCredentials().addToken(authToken.getService(), authToken);
                }

                logger.info("obtained Token /....");
            } catch (InterruptedException var5) {
                throw new IOException("Error while obtaining hbase delegation token", var5);
            }
        }

    }


private static Token<AuthenticationTokenIdentifier> getAuthToken(Configuration conf, User user) throws IOException, InterruptedException {
        ZooKeeperWatcher zkw = new ZooKeeperWatcher(conf, "mr-init-credentials", (Abortable) null);

        Token var4;
        try {
            String e = ZKClusterId.readClusterIdZNode(zkw);
            logger.info("====== clusterID : " + e);
            var4 = (new AuthenticationTokenSelector()).selectToken(new Text(e), user.getUGI().getTokens());
             if (var4 == null) {
                logger.info("var4 is null===========================");
            } else {
                logger.info("====== Hbase Token : " + var4.toString());
            }
        } catch (KeeperException var8) {
            throw new IOException(var8);
        } catch (NullPointerException np) {
            return null;
        } finally {
            zkw.close();
        }
        return var4;
 }

在 UDF 的 configure() 中调用 addHBaseDelegationToken() 之后。我收到以下异常。我不确定如何让 hvie 用户与 Hbase 交谈,因为 hive.keytab 由 Cloudera 处理并受到保护。

任何输入都可能会有所帮助。谢谢 !

异常堆栈跟踪:

2018-10-11 04:48:07,625 WARN [main] org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException as:hive (auth:SIMPLE) 原因:javax.security.sasl.SaslException: GSS 启动失败 [由 GSSException 引起:未提供有效凭据(机制级别:找不到任何 Kerberos tgt)] 2018-10-11 04:48:07,627 WARN [main] org.apache.hadoop.hbase.ipc.RpcClientImpl:连接到服务器时遇到异常:javax.security.sasl.SaslException:GSS 启动失败 [由 GSSException 引起:未提供有效凭据(机制级别:找不到任何 Kerberos tgt)] 2018-10-11 04:48:07,628 FATAL [main] org.apache .hadoop.hbase.ipc.RpcClientImpl:SASL 身份验证失败。最可能的原因是凭据丢失或无效。考虑“kinit”。javax.security.sasl.SaslException:

已尝试以下选项:

https://github.com/apache/oozie/blob/master/core/src/main/java/org/apache/oozie/action/hadoop/HbaseCredentials.java

https://github.com/ibm-research-ireland/sparkoscope/blob/master/yarn/src/main/scala/org/apache/spark/deploy/yarn/security/HBaseCredentialProvider.scala

4

0 回答 0