Delen via


Problemen met PolyBase Kerberos-connectiviteit oplossen

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

  1. 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

  2. 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:

  1. Kerberos-client (SQL Server)
  2. Beveiligde resource (HDFS, MR2, YARN, Taakgeschiedenis, enzovoort)
  3. 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:

  1. SQL Server maakt verbinding met de KDC en haalt een TGT op voor de gebruiker. De persoonlijke KDC-sleutel versleutelt de TGT.

  2. SQL Server roept de met Hadoop beveiligde resource, HDFS en bepaalt voor welke SPN een ST nodig is.

  3. 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.

  4. SQL Server stuurt de ST door naar Hadoop en wordt geverifieerd om een sessie tegen die service te creëren.

Diagram van PolyBase in SQL Server.

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.xml
  • hdfs-site.xml
  • hive-site.xml
  • jaas.conf
  • mapred-site.xml
  • yarn-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.AccessControlException
SIMPLE 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.LoginException
Client 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.LoginException
Checksum failed
Service Principal voor beheerders bestaat, maar er is een verkeerd wachtwoord.
Native config name: C:\Windows\krb5.ini
Loaded 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.LoginException
java.lang.IllegalArgumentException
Illegal 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.ConnectException
Attempting to access external filesystem at URI: hdfs://10.193.27.230:8020
Call 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.FileNotFoundException
File 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:

  1. 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 HdfsBridge klasse 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_user bevat u alleen de gebruikersnaam, geen domeinonderdeel.

  2. 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.

  3. Voor Active Directory Kerberos moet u ervoor zorgen dat u een ticket in de cache kunt zien met behulp van klist de opdracht in Windows.

    Maak verbinding met de PolyBase-machine en voer klist de klist tgt opdrachtprompt uit om te zien of de KDC-, gebruikersnaam- en versleutelingstypen juist zijn.

  4. Als KDC AES-256 alleen kan ondersteunen, controleert u of JCE-beleidsbestanden zijn geïnstalleerd.