Искра и защищенный феникс не работают с пряжей

Я пытаюсь подключиться к защищенному фениксу через искру в пряже с использованием JDBC, и я вижу в журналах, что он успешно подключается:

URL-адрес JDBC: jdbc:phoenix:zookeeper_quorum:/hbase-secure:[email protected]:/path/to/keytab/someprincipal.keytab

18/02/27 09:30:22 INFO ConnectionQueryServicesImpl: Trying to connect to a secure cluster with keytab:/path/to/keytab/someprincipal.keytab
18/02/27 09:30:22 DEBUG UserGroupInformation: hadoop login
18/02/27 09:30:22 DEBUG UserGroupInformation: hadoop login commit
18/02/27 09:30:22 DEBUG UserGroupInformation: using kerberos user:[email protected]
18/02/27 09:30:22 DEBUG UserGroupInformation: Using user: "[email protected]" with name [email protected]
18/02/27 09:30:22 DEBUG UserGroupInformation: User entry: "[email protected]"
18/02/27 09:30:22 INFO UserGroupInformation: Login successful for user [email protected] using keytab file /path/to/keytab/someprincipal.keytab
18/02/27 09:30:22 INFO ConnectionQueryServicesImpl: Successfull login to secure cluster!!

но позже, при попытке вызвать AbstractRpcClient, у меня возникает проблема, и он больше не использует аутентификацию KERBEROS в UserGroupInformation, и кажется, что он получает пользователя ОС вместо того, который я предоставил в JDBC

18/02/27 09:30:23 DEBUG AbstractRpcClient: RPC Server Kerberos principal name for service=ClientService is hbase/[email protected]
18/02/27 09:30:23 DEBUG AbstractRpcClient: Use KERBEROS authentication for service ClientService, sasl=true
18/02/27 09:30:23 DEBUG AbstractRpcClient: Connecting to some.host.name/10.000.145.544:16020
18/02/27 09:30:23 DEBUG UserGroupInformation: PrivilegedAction as:someuser (auth:SIMPLE) from:org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.setupIOstreams(RpcClientImpl.java:734)
18/02/27 09:30:23 DEBUG HBaseSaslRpcClient: Creating SASL GSSAPI client. Server's Kerberos principal name is hbase/[email protected]
18/02/27 09:30:23 DEBUG UserGroupInformation: PrivilegedActionException as:someuser (auth:SIMPLE) cause:javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
18/02/27 09:30:23 DEBUG UserGroupInformation: PrivilegedAction as:someuser (auth:SIMPLE) from:org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.handleSaslConnectionFailure(RpcClientImpl.java:637)
18/02/27 09:30:23 WARN AbstractRpcClient: Exception encountered while connecting to the server : javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
18/02/27 09:30:23 ERROR AbstractRpcClient: SASL authentication failed. The most likely cause is missing or invalid credentials. Consider 'kinit'.
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
    at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:211)
    at org.apache.hadoop.hbase.security.HBaseSaslRpcClient.saslConnect(HBaseSaslRpcClient.java:179)
    at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.setupSaslConnection(RpcClientImpl.java:611)
    at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.access$600(RpcClientImpl.java:156)
    at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection$2.run(RpcClientImpl.java:737)
    at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection$2.run(RpcClientImpl.java:734)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1724)
    at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.setupIOstreams(RpcClientImpl.java:734)
    at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.writeRequest(RpcClientImpl.java:887)
    at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.tracedWriteRequest(RpcClientImpl.java:856)
    at org.apache.hadoop.hbase.ipc.RpcClientImpl.call(RpcClientImpl.java:1199)
    at org.apache.hadoop.hbase.ipc.AbstractRpcClient.callBlockingMethod(AbstractRpcClient.java:213)
    at org.apache.hadoop.hbase.ipc.AbstractRpcClient$BlockingRpcChannelImplementation.callBlockingMethod(AbstractRpcClient.java:287)
    at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$BlockingStub.scan(ClientProtos.java:32741)
    at org.apache.hadoop.hbase.client.ScannerCallable.openScanner(ScannerCallable.java:379)
    at org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:201)
    at org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:63)
    at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithoutRetries(RpcRetryingCaller.java:200)
    at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas$RetryingRPC.call(ScannerCallableWithReplicas.java:364)
    at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas$RetryingRPC.call(ScannerCallableWithReplicas.java:338)
    at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:126)
    at org.apache.hadoop.hbase.client.ResultBoundedCompletionService$QueueingFuture.run(ResultBoundedCompletionService.java:65)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)
    at sun.security.jgss.krb5.Krb5InitCredential.getInstance(Krb5InitCredential.java:147)
    at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:122)
    at sun.security.jgss.krb5.Krb5MechFactory.getMechanismContext(Krb5MechFactory.java:187)
    at sun.security.jgss.GSSManagerImpl.getMechanismContext(GSSManagerImpl.java:224)
    at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:212)
    at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:179)
    at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:192)
    ... 26 more

Эта проблема возникает только тогда, когда я работаю в пряже, но когда я работаю на своем локальном компьютере, он использует ту же информацию UserGroupInformation и может без проблем подключаться к ClientService.

У вас есть идеи, почему это происходит?

Я уже включил в свой путь к классам (исполнитель) все необходимые конфигурации, такие как hbase-site.xml, core-site.xml, hdfs-site.xml, я также установил файл конфигурации JAAS.

Я заметил на своем локальном компьютере, что вначале UGI получает тот, который из моей ОС, а затем, поскольку я пытался подключиться к phoenix, phoenix (ConnectionQueryServicesImpl.java) переопределяет UGI с тем, который я указал в JDBC, поэтому при попытке чтобы подключиться снова, он использует правильный UGI.

При работе в кластере кажется, что это не так, хотя я успешно подключился к phoenix, при попытке снова использовать UGI он получает тот же из ОС - я работаю в том же исполнителе.


обратите внимание, что RpcClientImpl использует CurrentUser, который основан на пользователе ОС.

В моем драйвере всякий раз, когда я пытаюсь получить CurrentUser, он использует аутентификацию kerberos с принципалом - при условии, что kinit выполнен или keytab и принципал предоставлен в команде отправки искры.

В executor, когда в узле есть действительный токен, для LoginUser устанавливается аутентификация Kerberos, а для CurrentUser устанавливается простая аутентификация с использованием информации об ОС.

Как я могу заставить исполнителя изменить CurrentUser?

В любом случае, я могу решить эту проблему, принудительно выполнив обновление с помощью метода LoginUser с методом UserGroupInformation.doAs().


person Azel    schedule 27.02.2018    source источник
comment
Тому, кто понизит его, пожалуйста, укажите причину, по которой я могу улучшить свой вопрос. благодарю вас   -  person Azel    schedule 02.03.2018
comment
Вы получили какое-либо решение для этого?   -  person Anup Ghosh    schedule 12.05.2019
comment
Привет, Ануп, к сожалению, я не нашел решения этой проблемы. У меня был обходной путь (указанный выше), а также, в качестве альтернативы, мы узнали о токене делегирования Spark HBASE, чтобы искра обрабатывала Kerberos.   -  person Azel    schedule 13.05.2019


Ответы (1)


Через несколько недель я, наконец, перебрал его. Ключ устанавливает spark.yarn.security.credentials.hbase.enabled в true.

Отправить искру следующим образом:

spark-submit \
  --master yarn \
  --keytab my-keytab \
  --principal my-principal \
  --conf spark.yarn.security.credentials.hbase.enabled=true \
  # other configs

И в исполнителе создайте соединение phoenix без keytab и принципала:

String url = "jdbc:phoenix:2.1.8.1:2181:/hbase";
Connection conn = DriverManager.getConnection(url, properties);
person Peter Zhao    schedule 22.04.2021