Percikan dan phoenix yang diamankan tidak berfungsi pada benang

Saya mencoba menyambung ke phoenix aman melalui percikan benang menggunakan JDBC, dan saya dapat melihat di log, sambungan berhasil:

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!!

tetapi kemudian, ketika mencoba memanggil AbstrakRpcClient, saya mendapat masalah dan tidak lagi menggunakan otentikasi KERBEROS di UserGroupInformation, dan sepertinya ia mendapatkan pengguna OS daripada yang saya berikan di 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

Masalah ini hanya terjadi ketika saya menjalankan benang, tetapi ketika saya menjalankan di lokal saya, ia menggunakan Informasi Grup Pengguna yang sama dan dapat terhubung ke ClientService tanpa masalah apa pun.

Apakah Anda tahu mengapa ini terjadi?

Saya sudah memasukkan di classpath (pelaksana) saya semua konfigurasi yang diperlukan seperti hbase-site.xml, core-site.xml, hdfs-site.xml, saya juga mengatur file konfigurasi JAAS.

Saya perhatikan di lokal saya bahwa pada awalnya, UGI mendapatkannya dari OS saya, kemudian sejak saya mencoba terhubung ke phoenix, phoenix (ConnectionQueryServicesImpl.java) menimpa UGI dengan yang saya tunjukkan di JDBC, jadi ketika mencoba untuk menyambung kembali, ia menggunakan UGI yang benar.

Saat dijalankan di cluster, sepertinya tidak seperti itu, meskipun saya berhasil terhubung ke phoenix, ketika mencoba menggunakan UGI lagi, UGI mendapat yang dari OS - saya menjalankan di eksekutor yang sama.


perhatikan bahwa RpcClientImpl menggunakan CurrentUser yang didasarkan pada pengguna OS.

Di driver saya, setiap kali saya mencoba untuk mendapatkan Pengguna Saat Ini, ia menggunakan otentikasi kerberos dengan prinsipal - dengan asumsi kinit telah selesai atau keytab & prinsipal disediakan dalam perintah spark submit

Di eksekutor, ketika ada token yang valid di node, LoginUser diatur ke otentikasi kerberos tetapi CurrentUser diatur ke otentikasi sederhana menggunakan informasi OS

Bagaimana saya bisa membuat pelaksana mengubah Pengguna Saat Ini?

Bagaimanapun, saya dapat menyelesaikannya dengan memaksa melakukan pembaruan menggunakan metode LoginUser dengan UserGroupInformation.doAs()


person Azel    schedule 27.02.2018    source sumber
comment
Kepada siapa pun yang memberi suara negatif, harap berikan alasannya agar saya dapat memperbaiki pertanyaan saya. Terima kasih   -  person Azel    schedule 02.03.2018
comment
Apakah Anda mendapatkan solusi untuk ini?   -  person Anup Ghosh    schedule 12.05.2019
comment
Hai Anup, sayangnya saya tidak mendapatkan solusi apa pun untuk ini. Saya punya solusi (tercantum di atas) dan juga sebagai alternatif, kami telah mengetahui tentang token delegasi HBASE spark untuk membuat spark menangani kerberos.   -  person Azel    schedule 13.05.2019


Jawaban (1)


Setelah beberapa minggu, saya akhirnya menemukan jawabannya. Kuncinya adalah menyetel spark.yarn.security.credentials.hbase.enabled ke true.

Kirim percikan sebagai berikut:

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

Dan di eksekutor, buat koneksi phoenix tanpa keytab dan prinsipal:

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