Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Van toepassing op: SQL Server 2016 (13.x) en latere versies in Windows
Als u verificatieproblemen wilt oplossen bij het gebruik van PolyBase met een Met Kerberos beveiligd Hadoop-cluster, gebruikt u de interactieve diagnostische gegevens die zijn ingebouwd in PolyBase.
Dit artikel fungeert als een handleiding voor het doorlopen van het foutopsporingsproces van dergelijke problemen met behulp van deze ingebouwde diagnostische gegevens.
Aanbeveling
In plaats van de stappen in deze handleiding te volgen, kunt u ervoor kiezen om de HDFS Kerberos-tester uit te voeren om problemen met HDFS Kerberos-verbindingen voor PolyBase op te lossen wanneer u een HDFS Kerberos-fout ondervindt tijdens het maken van een externe tabel in een met Kerberos beveiligd HDFS-cluster.
Dit hulpprogramma helpt bij het uitsluiten van niet-SQL Server-problemen, zodat u zich kunt concentreren op het oplossen van problemen met het instellen van HDFS Kerberos, namelijk het identificeren van problemen met onjuiste configuraties van gebruikersnaam/wachtwoord en onjuiste configuraties van cluster-Kerberos.
Dit hulpprogramma is onafhankelijk van SQL Server. Het is beschikbaar als een Jupyter Notebook en vereist Azure Data Studio.
Vereiste voorwaarden
SQL Server 2016 (13.x) RTM CU6 / SQL Server 2016 (13.x) SP1 CU3 / SQL Server 2017 (14.x) of hoger waarop PolyBase is geïnstalleerd
Een Hadoop-cluster (Cloudera of Hortonworks) dat is beveiligd met Kerberos (Active Directory of MIT)
Introductie
Het helpt om eerst het Kerberos-protocol op hoog niveau te begrijpen. Er zijn drie actoren betrokken:
- Kerberos-client (SQL Server)
- Beveiligde resource (HDFS, MR2, YARN, Taakgeschiedenis, enzovoort)
- Sleuteldistributiecentrum (aangeduid als een domeincontroller in Active Directory)
Wanneer u Kerberos configureert op het Hadoop-cluster, registreert u elke met Hadoop beveiligde resource in het KDC (Key Distribution Center) met een unieke Service Principal Name (SPN). De client moet een tijdelijk gebruikersticket ophalen, een zogenaamde Ticket Granting Ticket (TGT), zodat het een ander tijdelijk ticket kan aanvragen, een serviceticket (ST) genoemd, van de KDC voor de specifieke SPN die het wil openen.
Wanneer u in PolyBase verificatie aanvraagt voor een met Kerberos beveiligde resource, wordt het volgende vierdelige roundtrip-handshake uitgevoerd:
SQL Server maakt verbinding met de KDC en haalt een TGT op voor de gebruiker. De persoonlijke KDC-sleutel versleutelt de TGT.
SQL Server roept de met Hadoop beveiligde resource, HDFS en bepaalt voor welke SPN een ST nodig is.
SQL Server gaat terug naar de KDC, geeft de TGT weer door en vraagt een ST om toegang te krijgen tot die beveiligde resource. De persoonlijke sleutel van de beveiligde service versleutelt de ST.
SQL Server stuurt de ST door naar Hadoop en wordt geverifieerd om een sessie tegen die service te creëren.
Problemen met verificatie vallen in een of meer van de vorige stappen. Om sneller te debuggen, biedt PolyBase een geïntegreerd diagnosticetool om het punt van falen te identificeren.
Probleemoplossingsproces
PolyBase gebruikt de volgende XML-configuratiebestanden voor het opslaan van eigenschappen van het Hadoop-cluster:
core-site.xmlhdfs-site.xmlhive-site.xmljaas.confmapred-site.xmlyarn-site.xml
U vindt deze bestanden in het volgende pad:
[System Drive]:{install path}{MSSQL##.INSTANCENAME}\MSSQL\Binn\PolyBase\Hadoop\conf
Het standaardpad voor SQL Server 2016 (13.x) is C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase\Hadoop\confbijvoorbeeld .
Bewerk core-site.xml en voeg deze eigenschappen toe. Stel de waarden in op basis van uw omgeving:
<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>
Opmerking
De waarde voor polybase.kerberos.realm eigenschap moet in hoofdletters zijn.
U moet de andere XML-bestanden bijwerken als u pushdownbewerkingen wilt inschakelen. U hebt toegang tot het HDFS-bestandssysteem met alleen dit bestand geconfigureerd.
Het hulpprogramma wordt onafhankelijk van SQL Server uitgevoerd, zodat het niet hoeft te worden uitgevoerd. U hoeft deze niet opnieuw op te starten als u de XML-configuratiebestanden bijwerkt. Als u het hulpprogramma wilt uitvoeren, voert u de volgende opdrachten uit op de host waarop SQL Server is geïnstalleerd:
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)}
In SQL Server 2019 (15.x) en latere versies kunt u bij de installatie van de PolyBase-functie verwijzen naar een bestaande Java Runtime-omgeving of AZUL-OpenJDK-JRE installeren. Als u AZUL-OpenJDK-JRE selecteert, java.exe maakt dit geen deel uit van de $PATH omgevingsvariabele en kan de fout optreden
'java' isn't recognized as an internal or external command, operable program or batch file.
Als deze fout optreedt, moet u het pad naar java.exe toevoegen aan de omgevingsvariabele van de sessie $PATH. Het standaardinstallatiepad van het uitvoerbare Java-bestand is C:\Program Files\Microsoft SQL Server\MSSQL15.<instance name>\AZUL-OpenJDK-JRE\bin. Als dat het pad is, moet u de volgende opdracht uitvoeren voordat u de java opdracht uitvoert om het hulpprogramma voor probleemoplossing voor Kerberos-connectiviteit uit te voeren.
set PATH=%PATH%;C:\Program Files\Microsoft SQL Server\MSSQL15.{instance name}\AZUL-OpenJDK-JRE\bin
Arguments
| Argument | Description |
|---|---|
| Naamknooppuntadres | Het IP-adres of de FQDN van het naamknooppunt. Verwijst naar het argument 'LOCATION' in uw CREATE EXTERNAL DATA SOURCE Transact-SQL.
Opmerking: de SQL Server 2019-versie van het hulpprogramma moet hdfs:// voorafgaan aan het IP-adres of de FQDN. |
| Naamknooppuntpoort | De poort van het naamknooppunt. Verwijst naar het argument 'LOCATION' in uw CREATE EXTERNAL DATA SOURCE T-SQL. Bijvoorbeeld 8020. |
| Service-principal | De service-principal van de beheerder voor uw KDC. Komt overeen met het argument 'IDENTITEIT' in uw CREATE DATABASE SCOPED CREDENTIAL T-SQL. |
| Servicewachtwoord | In plaats van uw wachtwoord in de console te typen, slaat u het op in een bestand en geeft u het bestandspad hier door. De inhoud van het bestand moet overeenkomen met wat u gebruikt als het argument 'GEHEIM' in uw CREATE DATABASE SCOPED CREDENTIAL T-SQL. |
| Extern HDFS-bestandspad (optioneel) | Het pad van een bestaand bestand voor toegang. Als dit niet is opgegeven, wordt de hoofdmap (/) gebruikt. |
Voorbeelden
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
De uitvoer is gedetailleerd voor uitgebreide foutopsporing, maar er zijn slechts vier belangrijke controlepunten waar je naar moet kijken, ongeacht of je MIT of AD gebruikt. Ze komen overeen met de vier stappen die eerder zijn beschreven.
De volgende fragmenten zijn afkomstig van een MIT KDC. Raadpleeg volledige voorbeelduitvoer van zowel MIT als AD aan het einde van dit artikel in de gerelateerde inhoud.
Controlepunt 1
Er moet een hexdump van een ticket zijn met Server Principal = krbtgt/MYREALM.COM@MYREALM.COM. Het geeft aan dat SQL Server succesvol is geverifieerd tegen de KDC en een TGT heeft ontvangen. Als dat niet het probleem is, ligt het probleem strikt tussen SQL Server en de KDC en niet Hadoop.
PolyBase biedt geen ondersteuning voor vertrouwensrelaties tussen AD en MIT en moet worden geconfigureerd op dezelfde KDC als geconfigureerd in het Hadoop-cluster. Maak in dergelijke omgevingen handmatig een serviceaccount op dat KDC en gebruik dit om verificatie uit te voeren.
>>> 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.
Controlepunt 2
PolyBase probeert toegang te krijgen tot de HDFS en mislukt omdat de aanvraag niet het benodigde serviceticket bevat.
[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
Controlepunt 3
Een tweede hexdump laat zien dat SQL Server de TGT gebruikt en het juiste serviceticket voor de SPN van het naamknooppunt van de KDC ophaalt.
>>> 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 .
Controlepunt 4
Ten slotte worden de bestandseigenschappen van het doelpad samen met een bevestigingsbericht afgedrukt. De bestandseigenschappen bevestigen dat SQL Server wordt geverifieerd door Hadoop met behulp van de ST en verleent een sessie voor toegang tot de beveiligde resource.
Het bereiken van dit punt bevestigt dat: (i) de drie actoren correct communiceren, (ii) de core-site.xml en jaas.conf correct zijn, en (iii) uw KDC uw inloggegevens herkent.
[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.
Veelvoorkomende fouten
Als u het hulpprogramma uitvoert en de bestandseigenschappen van het doelpad niet worden afgedrukt (Controlepunt 4), moet er halverwege automatisch een uitzondering optreden. Bekijk deze en bekijk de context van waar in de vierstapsstroom deze heeft plaatsgevonden. Houd rekening met de volgende veelvoorkomende problemen die kunnen optreden, in volgorde:
| Uitzondering en berichten | Oorzaak |
|---|---|
org.apache.hadoop.security.AccessControlExceptionSIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS] |
Het core-site.xml bestand stelt de hadoop.security.authentication eigenschap niet in op KERBEROS. |
javax.security.auth.login.LoginExceptionClient not found in Kerberos database (6) - CLIENT_NOT_FOUND |
De beheer service-principal bestaat niet in de realm die is opgegeven in core-site.xml. |
javax.security.auth.login.LoginExceptionChecksum failed |
Service Principal voor beheerders bestaat, maar er is een verkeerd wachtwoord. |
Native config name: C:\Windows\krb5.iniLoaded from native config |
Dit bericht geeft aan dat de krb5LoginModule van Java aangepaste clientconfiguraties heeft gedetecteerd op uw computer. Controleer de aangepaste clientinstellingen, omdat ze het probleem mogelijk veroorzaken. |
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> |
Voeg de hadoop.security.auth_to_local eigenschap toe aan core-site.xml met de juiste regels per Hadoop-cluster. |
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 |
Verificatie op basis van de KDC slaagt, maar heeft geen toegang tot het Hadoop-naamknooppunt. Controleer het IP-adres en de poort van het naamknooppunt. Controleer of de firewall is uitgeschakeld op Hadoop. |
java.io.FileNotFoundExceptionFile does not exist: /test/data.csv |
Verificatie slaagt, maar de opgegeven locatie bestaat niet. Controleer het pad of test eerst met root /. |
Tips voor foutopsporing
MIT KDC
U kunt alle SPN's weergeven die zijn geregistreerd bij de KDC, inclusief de beheerders, door kadmin.local> (beheerdersaccount) >listprincs uit te voeren op de KDC-host of een geconfigureerde KDC-client. Als u Kerberos correct configureert op het Hadoop-cluster, moet er één SPN zijn voor elke service die beschikbaar is in het cluster (bijvoorbeeld: nn, dnrm, yarn, , spnegoenzovoort). U kunt de bijbehorende keytabbestanden (wachtwoordvervangingen) standaard zien onder /etc/security/keytabs. De persoonlijke KDC-sleutel versleutelt deze bestanden.
Als u de beheerdersreferenties op de KDC lokaal wilt controleren, gebruikt u kinit. U kunt bijvoorbeeld uitvoeren kinit identity@MYREALM.COM. Als de identiteit bestaat, wordt u om een wachtwoord gevraagd.
De KDC-logboeken zijn standaard beschikbaar in /var/log/krb5kdc.log. De logboeken bevatten alle aanvragen voor tickets, inclusief het client-IP-adres dat de aanvraag heeft ingediend. Er moeten twee aanvragen zijn van het IP-adres van de SQL Server-machine waar u het hulpprogramma hebt uitgevoerd: eerst voor de TGT van de verificatieserver als een AS_REQ, gevolgd door een TGS_REQ voor de ST van de Ticket Granting Server.
[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
In Active Directory kunt u de SPN's weergeven door te navigeren naar Het Configuratiescherm>Active Directory: gebruikers en computers, en vervolgens naar <MyRealm> en selecteren <MyOrganizationalUnit>. Als u Kerberos op de juiste manier configureert in het Hadoop-cluster, is er één SPN voor elke service die beschikbaar is in het cluster (bijvoorbeeld: nn, dnrm, yarn, , spnegoenzovoort).
Algemene tips voor foutopsporing
Het is handig om enige Java-ervaring te hebben om de logboeken te bekijken en fouten op te sporen in de Kerberos-problemen, die onafhankelijk zijn van de SQL Server PolyBase-functie.
Als u nog steeds problemen ondervindt met het openen van Kerberos, voert u de volgende stappen uit om fouten op te sporen:
Zorg ervoor dat u toegang hebt tot de Kerberos HDFS-gegevens van buiten SQL Server. U kunt het volgende doen:
Schrijf uw eigen Java-programma of gebruik
HdfsBridgeklasse uit de polybase-installatiemap. Voorbeeld:-classpath ".\Hadoop\conf;.\Hadoop\*;.\Hadoop\HDP2_2\*" com.microsoft.polybase.client.HdfsBridge 10.193.27.232 8020 admin_user C:\temp\kerberos_pass.txt
In het vorige voorbeeld
admin_userbevat u alleen de gebruikersnaam, geen domeinonderdeel.Als u geen toegang hebt tot Kerberos HDFS-gegevens van buiten PolyBase:
Er zijn twee typen Kerberos-verificatie: Active Directory Kerberos-verificatie en MIT Kerberos-verificatie.
Zorg ervoor dat de gebruiker bestaat in een domeinaccount en gebruik hetzelfde gebruikersaccount tijdens het openen van HDFS.
Voor Active Directory Kerberos moet u ervoor zorgen dat u een ticket in de cache kunt zien met behulp van
klistde opdracht in Windows.Maak verbinding met de PolyBase-machine en voer
klistdeklist tgtopdrachtprompt uit om te zien of de KDC-, gebruikersnaam- en versleutelingstypen juist zijn.Als KDC AES-256 alleen kan ondersteunen, controleert u of JCE-beleidsbestanden zijn geïnstalleerd.