Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk: SQL Server 2016 (13.x) dan versi yang lebih baru di Windows
Untuk memecahkan masalah autentikasi saat menggunakan PolyBase dengan kluster Hadoop yang diamankan Kerberos, gunakan diagnostik interaktif yang dibangun ke dalam PolyBase.
Artikel ini berfungsi sebagai panduan untuk mengatasi masalah dengan menggunakan diagnostik bawaan ini.
Tip
Alih-alih mengikuti langkah-langkah dalam panduan ini, Anda dapat memilih untuk menjalankan HDFS Kerberos Tester untuk memecahkan masalah koneksi HDFS Kerberos untuk PolyBase, ketika Anda mengalami kegagalan HDFS Kerberos saat membuat tabel eksternal di kluster HDFS aman Kerberos.
Alat ini membantu mengesampingkan masalah non-SQL Server, untuk membantu Anda berkonsentrasi dalam menyelesaikan masalah penyiapan HDFS Kerberos, yaitu mengidentifikasi masalah dengan kesalahan konfigurasi nama pengguna/kata sandi, dan kesalahan konfigurasi penyiapan Kluster Kerberos.
Alat ini independen dari SQL Server. Ini tersedia sebagai Jupyter Notebook dan memerlukan Azure Data Studio.
Prasyarat
SQL Server 2016 (13.x) RTM CU6 / SQL Server 2016 (13.x) SP1 CU3 / SQL Server 2017 (14.x) atau lebih tinggi dengan PolyBase diinstal
Kluster Hadoop (Cloudera atau Hortonworks) diamankan dengan Kerberos (Direktori Aktif atau MIT)
Pendahuluan
Ini membantu untuk terlebih dahulu memahami protokol Kerberos pada tingkat tinggi. Tiga aktor terlibat:
- Klien Kerberos (SQL Server)
- Sumber daya aman (HDFS, MR2, YARN, Riwayat Pekerjaan, dll.)
- Pusat distribusi utama (disebut sebagai pengendali domain di Direktori Aktif)
Saat mengonfigurasi Kerberos pada kluster Hadoop, Anda mendaftarkan setiap sumber daya aman Hadoop di Key Distribution Center (KDC) dengan Nama Perwakilan Layanan (SPN) yang unik. Klien perlu mendapatkan tiket pengguna sementara, yang disebut Tiket Pemberian Tiket (TGT), sehingga dapat meminta tiket sementara lain, yang disebut Tiket Layanan (ST), dari KDC untuk SPN tertentu yang ingin diaksesnya.
Di PolyBase, ketika Anda meminta autentikasi terhadap sumber daya yang diamankan dengan Kerberos, proses jabat tangan yang terdiri dari empat kali bolak-balik berikut terjadi:
SQL Server terhubung ke KDC dan mendapatkan TGT untuk pengguna. Kunci privat KDC mengenkripsi TGT.
SQL Server memanggil sumber daya aman Hadoop, HDFS, dan menentukan SPN mana yang dibutuhkan ST.
SQL Server kembali ke KDC, meneruskan TGT kembali, dan meminta ST untuk mengakses sumber daya aman tertentu. Kunci privat layanan aman mengenkripsi ST.
SQL Server meneruskan ST ke Hadoop dan diautentikasi agar sesi dibuat terhadap layanan tersebut.
Diagram dari PolyBase di SQL Server.
Masalah dengan autentikasi termasuk dalam satu atau beberapa langkah sebelumnya. Untuk membantu penelusuran kesalahan yang lebih cepat, PolyBase menyediakan alat diagnostik terintegrasi untuk membantu mengidentifikasi titik kegagalan.
Pemecahan Masalah
PolyBase menggunakan file XML konfigurasi berikut untuk menyimpan properti kluster Hadoop:
core-site.xmlhdfs-site.xmlhive-site.xmljaas.confmapred-site.xmlyarn-site.xml
Anda dapat menemukan file-file ini di jalur berikut:
[System Drive]:{install path}{MSSQL##.INSTANCENAME}\MSSQL\Binn\PolyBase\Hadoop\conf
Misalnya, jalur default untuk SQL Server 2016 (13.x) adalah C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase\Hadoop\conf.
Edit core-site.xml dan tambahkan properti ini. Atur nilai sesuai dengan lingkungan Anda:
<property>
<name>polybase.kerberos.realm</name>
<value>CONTOSO.COM</value>
</property>
<property>
<name>polybase.kerberos.kdchost</name>
<value>kerberos.contoso.com</value>
</property>
<property>
<name>hadoop.security.authentication</name>
<value>KERBEROS</value>
</property>
Catatan
Nilai untuk polybase.kerberos.realm properti harus berupa huruf besar semua.
Anda perlu memperbarui file XML lainnya jika Anda ingin mengaktifkan operasi pushdown. Anda dapat mengakses sistem file HDFS hanya dengan file ini yang dikonfigurasi.
Alat ini berjalan secara independen dari SQL Server, sehingga tidak perlu berjalan. Anda tidak perlu memulai ulang jika Anda memperbarui file XML konfigurasi. Untuk menjalankan alat, jalankan perintah berikut pada host dengan SQL Server terinstal:
cd C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase
java -classpath ".\Hadoop\conf;.\Hadoop\*;.\Hadoop\HDP2_2\*" com.microsoft.polybase.client.HdfsBridge {Name Node Address} {Name Node Port} {Service Principal} {Filepath containing Service Principal's Password} {Remote HDFS file path (optional)}
Di SQL Server 2019 (15.x) dan versi yang lebih baru, saat Anda menginstal fitur PolyBase, Anda dapat mereferensikan Java Runtime Environment yang ada, atau menginstal AZUL-OpenJDK-JRE. Jika Anda memilih AZUL-OpenJDK-JRE, java.exe bukan bagian $PATH dari variabel lingkungan dan Anda mungkin mengalami kesalahan
'java' isn't recognized as an internal or external command, operable program or batch file.
Jika kesalahan ini terjadi, Anda perlu menambahkan jalur ke java.exe variabel lingkungan sesi $PATH . Jalur penginstalan default dari Executable Java adalah C:\Program Files\Microsoft SQL Server\MSSQL15.<instance name>\AZUL-OpenJDK-JRE\bin. Jika itu adalah jalurnya, maka Anda perlu menjalankan perintah berikut sebelum menjalankan java perintah untuk menjalankan alat Pemecahan Masalah Konektivitas Kerberos.
set PATH=%PATH%;C:\Program Files\Microsoft SQL Server\MSSQL15.{instance name}\AZUL-OpenJDK-JRE\bin
Argumen
| Argumen | Deskripsi |
|---|---|
| Alamat Node Nama | IP atau FQDN dari node nama. Mengacu pada argumen "LOCATION" dalam CREATE EXTERNAL DATA SOURCE Transact-SQL Anda.
Catatan: alat versi SQL Server 2019 mengharuskan hdfs:// untuk mendahului IP atau FQDN. |
| Port Node Nama | Port node nama. Mengacu pada argumen "LOCATION" di CREATE EXTERNAL DATA SOURCE T-SQL Anda. Misalnya, 8020. |
| Perwakilan Layanan | Perwakilan layanan admin ke KDC Anda. Cocok dengan argumen "IDENTITY" di T-SQL Anda CREATE DATABASE SCOPED CREDENTIAL . |
| Kata Sandi Layanan | Alih-alih mengetik kata sandi Anda di konsol, simpan dalam file dan lewati jalur file di sini. Konten file harus cocok dengan apa yang Anda gunakan sebagai argumen "SECRET" di T-SQL Anda CREATE DATABASE SCOPED CREDENTIAL . |
| Jalur file HDFS jarak jauh (opsional) | Jalur file yang ada untuk diakses. Jika tidak ditentukan, folder akar (/) digunakan. |
Examples
java -classpath ".\Hadoop\conf;.\Hadoop\*;.\Hadoop\HDP2_2\*" com.microsoft.polybase.client.HdfsBridge 10.193.27.232 8020 admin_user C:\temp\kerberos_pass.txt
Outputnya sangat rinci untuk membantu penelusuran kesalahan yang lebih baik, tetapi hanya ada empat pemeriksaan utama yang harus diperhatikan terlepas dari apakah Anda menggunakan MIT atau AD. Mereka sesuai dengan empat langkah yang diuraikan sebelumnya.
Kutipan berikut berasal dari MIT KDC. Lihat output sampel lengkap dari MIT dan AD di akhir artikel ini di konten Terkait.
Titik pemeriksaan 1
Harus ada cadangan hex tiket dengan Server Principal = krbtgt/MYREALM.COM@MYREALM.COM. Ini menunjukkan bahwa SQL Server berhasil diautentikasi terhadap KDC dan menerima TGT. Jika tidak, masalahnya terletak secara ketat antara SQL Server dan KDC, dan bukan Hadoop.
PolyBase tidak mendukung relasi kepercayaan antara AD dan MIT dan harus dikonfigurasi pada KDC yang sama dengan yang dikonfigurasi di kluster Hadoop. Di lingkungan tersebut, buat akun layanan secara manual di KDC tersebut, dan gunakan untuk melakukan autentikasi.
>>> KrbAsReq creating message
>>> KrbKdcReq send: kdc=kerberos.contoso.com UDP:88, timeout=30000, number of retries =3, #bytes=143
>>> KDCCommunication: kdc=kerberos.contoso.com UDP:88, timeout=30000,Attempt =1, #bytes=143
>>> KrbKdcReq send: #bytes read=646
>>> KdcAccessibility: remove kerberos.contoso.com
>>> EType: sun.security.krb5.internal.crypto.Des3CbcHmacSha1KdEType
>>> KrbAsRep cons in KrbAsReq.getReply myuser
[2017-04-25 21:34:33,548] INFO 687[main] - com.microsoft.polybase.client.KerberosSecureLogin.secureLogin(KerberosSecureLogin.java:97) - Subject:
Principal: admin_user@CONTOSO.COM
Private Credential: Ticket (hex) =
0000: 61 82 01 48 30 82 01 44 A0 03 02 01 05 A1 0E 1B a..H0..D........
0010: 0C 41 50 53 48 44 50 4D 53 2E 43 4F 4D A2 21 30 .CONTOSO.COM.!0
0020: 1F A0 03 02 01 02 A1 18 30 16 1B 06 6B 72 62 74 ........0...krbt
0030: 67 74 1B 0C 41 50 53 48 44 50 4D 53 2E 43 4F 4D gt..CONTOSO.COM
0040: A3 82 01 08 30 82 01 04 A0 03 02 01 10 A1 03 02 ....0...........
*[...Condensed...]*
0140: 67 6D F6 41 6C EB E0 C3 3A B2 BD B1 gm.Al...:...
Client Principal = admin_user@CONTOSO.COM
Server Principal = krbtgt/CONTOSO.COM@CONTOSO.COM
*[...Condensed...]*
[2017-04-25 21:34:34,500] INFO 1639[main] - com.microsoft.polybase.client.HdfsBridge.main(HdfsBridge.java:1579) - Successfully authenticated against KDC server.
Titik pemeriksaan 2
PolyBase melakukan upaya untuk mengakses HDFS dan gagal karena permintaan tidak berisi Tiket Layanan yang diperlukan.
[2017-04-25 21:34:34,501] INFO 1640[main] - com.microsoft.polybase.client.HdfsBridge.main(HdfsBridge.java:1584) - Attempting to access external filesystem at URI: hdfs://10.193.27.232:8020
Found ticket for admin_user@CONTOSO.COM to go to krbtgt/CONTOSO.COM@CONTOSO.COM expiring on Wed Apr 26 21:34:33 UTC 2017
Entered Krb5Context.initSecContext with state=STATE_NEW
Found ticket for admin_user@CONTOSO.COM to go to krbtgt/CONTOSO.COM@CONTOSO.COM expiring on Wed Apr 26 21:34:33 UTC 2017
Service ticket not found in the subject
Titik pemeriksaan 3
Cadangan hex kedua menunjukkan bahwa SQL Server berhasil menggunakan TGT dan mendapatkan Tiket Layanan yang tepat untuk SPN simpul nama dari KDC.
>>> KrbKdcReq send: kdc=kerberos.contoso.com UDP:88, timeout=30000, number of retries =3, #bytes=664
>>> KDCCommunication: kdc=kerberos.contoso.com UDP:88, timeout=30000,Attempt =1, #bytes=664
>>> KrbKdcReq send: #bytes read=669
>>> KdcAccessibility: remove kerberos.contoso.com
>>> EType: sun.security.krb5.internal.crypto.Des3CbcHmacSha1KdEType
>>> KrbApReq: APOptions are 00100000 00000000 00000000 00000000
>>> EType: sun.security.krb5.internal.crypto.Des3CbcHmacSha1KdEType
Krb5Context setting mySeqNumber to: 1033039363
Created InitSecContextToken:
0000: 01 00 6E 82 02 4B 30 82 02 47 A0 03 02 01 05 A1 ..n..K0..G......
0010: 03 02 01 0E A2 07 03 05 00 20 00 00 00 A3 82 01 ......... ......
0020: 63 61 82 01 5F 30 82 01 5B A0 03 02 01 05 A1 0E ca.._0..[.......
0030: 1B 0C 41 50 53 48 44 50 4D 53 2E 43 4F 4D A2 26 ..CONTOSO.COM.&
0040: 30 24 A0 03 02 01 00 A1 1D 30 1B 1B 02 6E 6E 1B 0$.......0...nn.
0050: 15 73 68 61 73 74 61 2D 68 64 70 32 35 2D 30 30 .hadoop-hdp25-00
0060: 2E 6C 6F 63 61 6C A3 82 01 1A 30 82 01 16 A0 03 .local....0.....
0070: 02 01 10 A1 03 02 01 01 A2 82 01 08 04 82 01 04 ................
*[...Condensed...]*
0240: 03 E3 68 72 C4 D2 8D C2 8A 63 52 1F AE 26 B6 88 ..hr.....cR..&..
0250: C4 .
Titik pemeriksaan 4
Terakhir, properti file dari jalur target ditampilkan bersama dengan pesan konfirmasi. Properti file mengonfirmasi bahwa SQL Server diautentikasi oleh Hadoop menggunakan ST dan memberikan sesi untuk mengakses sumber daya yang aman.
Mencapai titik ini mengonfirmasi bahwa: (i) ketiga aktor berkomunikasi dengan benar, (ii) core-site.xml dan jaas.conf benar, dan (iii) KDC Anda mengenali kredensial Anda.
[2017-04-25 21:34:35,096] INFO 2235[main] - com.microsoft.polybase.client.HdfsBridge.main(HdfsBridge.java:1586) - File properties for "/": FileStatus{path=hdfs://10.193.27.232:8020/; isDirectory=true; modification_time=1492028259862; access_time=0; owner=hdfs; group=hdfs; permission=rwxr-xr-x; isSymlink=false}
[2017-04-25 21:34:35,098] INFO 2237[main] - com.microsoft.polybase.client.HdfsBridge.main(HdfsBridge.java:1587) - Successfully accessed the external file system.
Kesalahan umum
Jika Anda menjalankan alat dan properti file jalur target tidak ditampilkan (Titik Pemeriksaan 4), pengecualian harus dilemparkan di tengah proses. Tinjau dan pertimbangkan konteks di mana dalam alur empat langkah itu terjadi. Pertimbangkan masalah umum berikut yang dapat terjadi, secara berurutan:
| Pengecualian dan pesan | Penyebab |
|---|---|
org.apache.hadoop.security.AccessControlExceptionSIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS] |
File core-site.xml tidak mengatur hadoop.security.authentication properti ke KERBEROS. |
javax.security.auth.login.LoginExceptionClient not found in Kerberos database (6) - CLIENT_NOT_FOUND |
Perwakilan Layanan admin tidak ada di realm yang ditentukan dalam core-site.xml. |
javax.security.auth.login.LoginExceptionChecksum failed |
Perwakilan Layanan Admin ada, tetapi kata sandi buruk. |
Native config name: C:\Windows\krb5.iniLoaded from native config |
Pesan ini menunjukkan bahwa krb5LoginModule Java mendeteksi konfigurasi klien kustom di komputer Anda. Periksa pengaturan klien kustom Anda karena mungkin menyebabkan masalah. |
javax.security.auth.login.LoginExceptionjava.lang.IllegalArgumentExceptionIllegal principal name <admin_user@CONTOSO.COM>: org.apache.hadoop.security.authentication.util.KerberosName$NoMatchingRule: No rules applied to <admin_user@CONTOSO.COM> |
Tambahkan properti hadoop.security.auth_to_local ke core-site.xml sesuai aturan kluster Hadoop. |
java.net.ConnectExceptionAttempting to access external filesystem at URI: hdfs://10.193.27.230:8020Call From IAAS16981207/10.107.0.245 to 10.193.27.230:8020 failed on connection exception |
Autentikasi terhadap KDC berhasil, tetapi gagal mengakses simpul nama Hadoop. Periksa IP dan port node nama. Verifikasi bahwa firewall dinonaktifkan pada Hadoop. |
java.io.FileNotFoundExceptionFile does not exist: /test/data.csv |
Autentikasi berhasil, tetapi lokasi yang ditentukan tidak ada. Periksa jalur atau uji dengan root terlebih / dahulu. |
Tips men-debug
MIT KDC
Anda dapat melihat semua SPN yang terdaftar di KDC, termasuk admin, dengan menjalankan listprinc>> (akun admin) pada host KDC atau klien KDC apa pun yang dikonfigurasi. Jika Anda mengonfigurasi Kerberos dengan benar pada kluster Hadoop, harus ada satu SPN untuk setiap layanan yang tersedia di kluster (misalnya: nn, , dnrm, yarn, spnego, dan sebagainya). Anda dapat melihat file keytab yang sesuai (pengganti kata sandi) di bawah /etc/security/keytabs, secara default. Kunci privat KDC mengenkripsi file-file ini.
Untuk memverifikasi kredensial admin pada KDC secara lokal, gunakan kinit. Misalnya, Anda dapat menjalankan kinit identity@MYREALM.COM. Jika identitas ada, Anda akan dimintai kata sandi.
Log KDC dapat diakses di /var/log/krb5kdc.log, secara bawaan. Log mencakup semua permintaan tiket, termasuk IP klien yang membuat permintaan. Harus ada dua permintaan dari IP komputer SQL Server tempat Anda menjalankan alat: pertama untuk TGT dari Server Autentikasi sebagai AS_REQ, diikuti oleh TGS_REQ untuk ST dari Server Pemberian Tiket.
[root@MY-KDC log]# tail -2 /var/log/krb5kdc.log
May 09 09:48:26 MY-KDC.local krb5kdc[2547](info): **AS_REQ** (3 etypes {17 16 23}) 10.107.0.245: ISSUE: authtime 1494348506, etypes {rep=16 tkt=16 ses=16}, admin_user@CONTOSO.COM for **krbtgt/CONTOSO.COM@CONTOSO.COM**
May 09 09:48:29 MY-KDC.local krb5kdc[2547](info): **TGS_REQ** (3 etypes {17 16 23}) 10.107.0.245: ISSUE: authtime 1494348506, etypes {rep=16 tkt=16 ses=16}, admin_user@CONTOSO.COM for **nn/hadoop-hdp25-00.local@CONTOSO.COM**
Active Directory
Di Direktori Aktif, Anda dapat melihat SPN dengan membuka Panel> KontrolPengguna Direktori Aktif dan Komputer, lalu masuk <MyRealm> dan memilih <MyOrganizationalUnit>. Jika Anda mengonfigurasi Kerberos dengan benar pada kluster Hadoop, ada satu SPN untuk setiap layanan yang tersedia di kluster (misalnya: nn, , dn, rmyarn, spnego, dan sebagainya).
Tips penelusuran kesalahan umum
Sangat membantu untuk memiliki beberapa pengalaman Java untuk meninjau log dan memecahkan masalah Kerberos, yang tidak tergantung pada fitur SQL Server PolyBase.
Jika Anda masih mengalami masalah saat mengakses Kerberos, ikuti langkah-langkah berikut untuk men-debug:
Pastikan Anda dapat mengakses data HDFS Kerberos dari luar SQL Server. Anda dapat:
Tulis program Java Anda sendiri, atau gunakan
HdfsBridgekelas dari folder penginstalan PolyBase. Contohnya:-classpath ".\Hadoop\conf;.\Hadoop\*;.\Hadoop\HDP2_2\*" com.microsoft.polybase.client.HdfsBridge 10.193.27.232 8020 admin_user C:\temp\kerberos_pass.txt
Dalam contoh sebelumnya,
admin_userhanya menyertakan nama pengguna - bukan bagian domain apa pun.Jika Anda tidak dapat mengakses data HdFS Kerberos dari luar PolyBase:
Ada dua jenis autentikasi Kerberos: Autentikasi Kerberos direktori aktif, dan autentikasi MIT Kerberos.
Pastikan pengguna ada di akun domain dan gunakan akun pengguna yang sama saat mencoba mengakses HDFS.
Untuk direktori aktif Kerberos, pastikan Anda dapat melihat tiket cache menggunakan
klistperintah di Windows.Sambungkan ke komputer PolyBase dan jalankan
klistdanklist tgtdi prompt perintah untuk melihat apakah jenis KDC, nama pengguna, dan enkripsi sudah benar.Jika KDC hanya dapat mendukung AES-256, pastikan file kebijakan JCE diinstal.