Поиск Hbase Tbl из UDF (Билайн, Hbase, Токены делегирования) - PullRequest
0 голосов
/ 17 октября 2018

У меня есть требование написать пользовательский UDF для поиска данных из таблицы Hbase.

ПРИМЕЧАНИЕ. Я провел модульное тестирование на ВИЧ.Кажется, это работает .

Но когда я использую тот же UDF Билайн, это не удалось.По умолчанию Cloudera ограничивает олицетворение и разрешает только пользователям улья выполнять запросы в Beeline.При запуске задания YarnChild устанавливает следующие токены делегирования.

Я хочу добавить токен (Вид: HBASE_AUTH_TOKEN ) для работы с Hbase.

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

Я исследовали выяснил, как HbaseStorageHandler использует токен делегирования (то есть HBASE_AUTH_TOKEN) для Hbase.Поэтому я использовал тот же набор функций, и он тоже не работал.

Функции из 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;
 }

После вызова addHBaseDelegationToken () в configure () UDF.Я получаю следующее исключение. Я не уверен, как я могу заставить пользователя hvie общаться с Hbase, поскольку hive.keytab обрабатывается Cloudera и обеспечивает его безопасность.

Любые входы могут быть полезны.Спасибо!

Exception StackTrace:

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.Наиболее вероятная причина - отсутствие или неверные учетные данные.Рассмотрим «Кинит».javax.security.sasl.SaslException: инициировать GSS не удалось [вызвано GSSException: действительные учетные данные не предоставлены (уровень механизма: не удалось найти любой Kerberos tgt)] на com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge (GssKrb5Client.212apache.hadoop.hbase.ipc.RpcClientImpl $ Connection.access $ 700 (RpcClientImpl.java:163) в org.apache.hadoop.hbase.ipc.RpcClientImpl $ Соединение $ 2.run (RpcClientImpl.java:7g. at или orp. at.hadoop.hbase.ipc.RpcClientImpl $ Connection $ 2.run (RpcClientImpl.java:741) в java.security.AccessController.doPrivileged (собственный метод) в javax.security.auth.Subject.doAs (Subject.java:422) или.apache.hadoop.security.UserGroupInformation.doAs (UserGroupInformation.java:1920) в org.apache.hadoop.hbase.ipc.RpcClientImpl $ Connection.setupIOstreams (RpcClientImpl.java: 741) в org.apache.hadoop.hbase.ipc.RpcClientImpl $ Connection.writeRequest (RpcClientImpl.java:907) в org.apache.hadoop.hbase.ipc.RpcClientImpl $ Connection.tracedWriteRejliI )74в org.apache.hadoop.hbase.ipc.RpcClientImpl.call (RpcClientImpl.java:1246) в org.apache.hadoop.hbase.ipc.AbstractRpcClient.callBlockingMethod (AbstractRpcClient.joopgaph.hb: 22).ipc.AbstractRpcClient $ BlockingRpcChannelImplementation.callBlockingMethod (AbstractRpcClient.java:336) в org.apache.hadoop.hbase.protobuf.generated.ClientProtos $ ClientService $ BlockingStub.execSerase.aph.hb.hb или в клиентском приложении.protobuf.(RegionCoprocessorRpcChannel.java:94)в org.apache.hadoop.hbase.client.RpcRetringCaller.callWithRetries (RpcRetringCaller.java:136) в org.apache.hadoop.hbase.ipc.RegionCoprocessorRpcChannel.callExecServiceorh.hb.cg.ipc.CoprocessorRpcChannel.callBlockingMethod (CoprocessorRpcChannel.java:73) в org.apache.hadoop.hbase.protobuf.generated.AuthenticationProtos $ AuthenticationService $ BlockingStub.getAuthenticationToken (аутентификация.aub)..token.TokenUtil.obtainToken (TokenUtil.java:86) в org.apache.hadoop.hbase.security.token.TokenUtil $ 1.run (TokenUtil.java:111) в org.apache.hadoop.hbase.security.token.TokenUtil $ 1.run (TokenUtil.java:108) в java.security.AccessController.doPrivileged (собственный метод) в javax.security.auth.Subject.doAs (Subject.java:422) в org.apache.hadoop.security.UserGroupInformation.doAs (UserGroupInformation.java:1920) в org.apache.hadoop.hbase.security.User $ SecureHadoopUser.runAs (User.java:340) в org.apache.hadoop.hbase.security.token.TokenUtil.obtainToken (TokenUtil.java:108) по адресу com.barclaycardus.hadoop.utils.udfs.HbaseTblLookupUDF.configure (HbaseTblLookupUDF.java:1aph.jav.1ache.h.had.h.ql.exec.MapredContext.setup (MapredContext.java:120) по адресу org.apache.hadoop.hive.ql.exec.ExprNodeGenericFuncEvaluator.initialize (ExprNodeGenericFuncEvaluator.java:143) по адресу org.apache.hadoop.exe.Operator.initEvaluators (Operator.java:954) в org.apache.hadoop.hive.ql.exec.Operator.initEvaluatorsAndReturnStruct (Operator.java:980) в org.apache.hadoop.hive.ql.exec.SelectOperator.initializeOp (ВыберитеOperator.java:63) в org.apache.hadoop.hive.ql.exec.Operator.initialize (Operator.java:385) в org.apache.hadoop.hive.ql.exec.Operator.initialize (Operator.java:469) в org.apache.hadoop.hive.ql.exec.Operator.initializeChildren (Operator.java:425) в org.apache.hadoop.hive.ql.exec.TableScanOperator.initializeOp (TableScanOperator.java:196) в org.apache.hadoop.hive.ql.exec.Operator.initialize (Operator.java: 385) в org.apache.hadoop.hive.ql.exec.MapOperator.initializeOp (MapOperator.java:431) в org.apache.hadoop.hive.ql.exec.Operator.initialize (Operator.java:385)в org.apache.hadoop.hive.ql.exec.mr.ExecMapper.configure (ExecMapper.java:126) в sun.reflect.NativeMethodAccessorImpl.invoke0 (родной метод) в sun.reflect.NativeMethodAccessorImpl.inethoj: (62) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) в org.apache.hadoop.util.ReflectionUtils.setJob.Ufs.job: 106) в org.apache.hadoop.util.ReflectionUtils.setConf (ReflectionUtils.java:75) в org.apache.hadoop.util.ReflectionUtils.newInstance (ReflectionUtils.java:133) в org.apache.hadoop.mapred.MapRunner.configure (MapRunner.java:38) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в sun.refate.DelegateMatehodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) в org.apache.hadoop.util.ReflectionUtils.setJobConf (ReflectionUtils.javag: at6).hadoop.util.ReflectionUtils.setConf (ReflectionUtils.java:75) в org.apache.hadoop.util.ReflectionUtils.newInstance (ReflectionUtils.java:133) в org.apache.hadoop.mapred.MapTask.runOldMapper (MapTas: 455) в org.apache.hadoop.mapred.MapTask.run (MapTask.java:343) в org.apache.hadoop.mapred.YarnChild $ 2.run (YarnChild.java:164) в java.security.AccessController.doPrivileged(Собственный метод) в javax.security.auth.Subject.doAs (Subject.java:422)в org.apache.hadoop.security.UserGroupInformation.doAs (UserGroupInformation.java:1920) в org.apache.hadoop.mapred.YarnChild.main (YarnChild.java:158) Причина: GSSException: не предоставлены действительные учетные данные (уровень механизма): Не удалось найти какой-либо tgt Kerberos) в sun.security.jgss.krb5.Krb5InitCredential.getInstance (Krb5InitCredential.java:147) в sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement (sunbj)..jgss.sun.security.jgss.GSSContextImpl.initSecContext (GSSContextImpl.java:179) в com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge (GssKrb5Client.java:192) ... 30 * 10 * 28 * 10 10 * 28* Уже опробовал ниже варианты:

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

...