Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a: SQL Server 2016 (13.x) y versiones posteriores en Windows
Para solucionar problemas de autenticación al usar PolyBase con un clúster de Hadoop protegido por Kerberos, use los diagnósticos interactivos integrados en PolyBase.
Este artículo sirve como guía para recorrer el proceso de depuración de estos problemas mediante estos diagnósticos integrados.
Sugerencia
En lugar de seguir los pasos descritos en esta guía, puede ejecutar HDFS Kerberos Tester para solucionar problemas de las conexiones Kerberos de HDFS para PolyBase, cuando experimente un error de Kerberos de HDFS al crear una tabla externa en un clúster de HDFS protegido con Kerberos.
Esta herramienta ayuda a descartar problemas que no son de SQL Server, para ayudarle a concentrarse en resolver problemas de configuración de Kerberos de HDFS, a saber, identificar problemas con errores de configuración de nombre de usuario y contraseña y configuraciones incorrectas de configuración de Kerberos del clúster.
Esta herramienta es independiente de SQL Server. Está disponible como jupyter Notebook y requiere Azure Data Studio.
Requisitos previos
SQL Server 2016 (13.x) RTM CU6 / SQL Server 2016 (13.x) SP1 CU3 / SQL Server 2017 (14.x) o superior con PolyBase instalado
Un clúster de Hadoop (Cloudera o Hortonworks) protegido con Kerberos (Active Directory o MIT)
Introducción
Ayuda a comprender el protocolo Kerberos por encima. Hay tres actores implicados:
- Cliente Kerberos (SQL Server)
- Recursos protegidos (HDFS, MR2, YARN, historial de trabajos, etc.)
- Centro de distribución de claves (que en Active Directory se denomina controlador de dominio)
Al configurar Kerberos en el clúster de Hadoop, registrará cada recurso protegido de Hadoop en el Centro de Distribución de Claves (KDC) con un Nombre Principal de Servicio (SPN) único. El cliente debe obtener un vale de usuario temporal, denominado vale de concesión de vales (TGT), por lo que puede solicitar otro vale temporal, denominado vale de servicio (ST), desde el KDC para el SPN específico al que quiere acceder.
En PolyBase, cuando se solicita autenticación contra cualquier recurso protegido por Kerberos, se lleva a cabo la siguiente secuencia de cuatro interacciones:
SQL Server se conecta al KDC y obtiene un TGT para el usuario. La clave privada KDC cifra el TGT.
SQL Server llama al recurso protegido de Hadoop, HDFS, y determina para qué nombre de entidad de seguridad de servicio necesita un ST.
SQL Server vuelve al Centro de distribución de claves, vuelve a pasar el TGT y solicita un ST para acceder a ese recurso protegido concreto. La clave privada del servicio protegido cifra el ST.
SQL Server desvía el ST a Hadoop y se autentica para que se cree una sesión contra ese servicio.
Los problemas con la autenticación se dividen en uno o varios de los pasos anteriores. Para permitir una depuración más rápida, PolyBase proporciona una herramienta de diagnóstico integrada para ayudar a identificar el punto de falla.
Solución de problemas
PolyBase usa los siguientes archivos XML de configuración para almacenar propiedades del clúster de Hadoop:
core-site.xmlhdfs-site.xmlhive-site.xmljaas.confmapred-site.xmlyarn-site.xml
Puede encontrar estos archivos en la siguiente ruta de acceso:
[System Drive]:{install path}{MSSQL##.INSTANCENAME}\MSSQL\Binn\PolyBase\Hadoop\conf
Por ejemplo, la ruta de acceso predeterminada para SQL Server 2016 (13.x) es C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase\Hadoop\conf.
Edite core-site.xml y agregue estas propiedades. Establezca los valores según su entorno:
<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>
Nota:
El valor de la polybase.kerberos.realm propiedad debe estar en mayúsculas.
Debe actualizar los demás archivos XML si desea habilitar las operaciones de procesamiento directo. Puede acceder al sistema de archivos HDFS con solo este archivo configurado.
La herramienta se ejecuta independientemente de SQL Server, por lo que no es necesario que se ejecute. No es necesario reiniciarlo si actualiza los archivos XML de configuración. Para ejecutar la herramienta, ejecute los comandos siguientes en el host con SQL Server instalado:
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)}
En SQL Server 2019 (15.x) y versiones posteriores, al instalar la característica PolyBase, puede hacer referencia a un entorno en tiempo de ejecución de Java existente o instalar AZUL-OpenJDK-JRE. Si selecciona AZUL-OpenJDK-JRE, java.exe no forma parte de la $PATH variable de entorno y es posible que encuentre el error.
'java' isn't recognized as an internal or external command, operable program or batch file.
Si se produce este error, debe agregar la ruta de acceso java.exe a la variable de entorno de la sesión $PATH. La ruta de instalación predeterminada del ejecutable de Java es C:\Program Files\Microsoft SQL Server\MSSQL15.<instance name>\AZUL-OpenJDK-JRE\bin. Si ese es el procedimiento, debe ejecutar el siguiente comando antes de ejecutar el comando para ejecutar la java herramienta de solución de problemas de conectividad Kerberos.
set PATH=%PATH%;C:\Program Files\Microsoft SQL Server\MSSQL15.{instance name}\AZUL-OpenJDK-JRE\bin
Argumentos
| Argument | Descripción |
|---|---|
| Dirección del nodo de nombre | La dirección IP o el nombre de dominio completo del nodo de nombre. Hace referencia al argumento "LOCATION" de CREATE EXTERNAL DATA SOURCE Transact-SQL.
Nota: La versión de SQL Server 2019 de la herramienta requiere hdfs:// preceder a la dirección IP o el FQDN. |
| Puerto del nodo de nombre | El puerto del nodo de nombre. Hace referencia al argumento "LOCATION" de CREATE EXTERNAL DATA SOURCE T-SQL. Por ejemplo, 8020. |
| Entidad de seguridad de servicio | La entidad de servicio de administración del Centro de distribución de claves. Coincide con el argumento "IDENTITY" de CREATE DATABASE SCOPED CREDENTIAL T-SQL. |
| Contraseña del servicio | En lugar de escribir la contraseña en la consola, almacénela en un archivo y pase aquí la ruta de acceso al archivo. El contenido del archivo debe coincidir con el que use como argumento "SECRET" en CREATE DATABASE SCOPED CREDENTIAL T-SQL. |
| Ruta de acceso al archivo HDFS remoto (opcional) | La ruta de acceso de un archivo existente al cual acceder. Si no se especifica, se usa la carpeta raíz (/). |
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
La salida es detallada para la depuración mejorada, pero solo hay cuatro puntos de control principales para buscar independientemente de si usa MIT o AD. Corresponden a los cuatro pasos descritos anteriormente.
Los extractos siguientes provienen de un Centro de distribución de claves de MIT. Consulte las salidas de ejemplo completas de MIT y AD al final de este artículo en el contenido relacionado.
Punto de comprobación 1
Debe haber un volcado hexadecimal de un vale con Server Principal = krbtgt/MYREALM.COM@MYREALM.COM. Indica que SQL Server se ha autenticado correctamente en el Centro de distribución de claves y ha recibido un TGT. Si no es así, el problema se encuentra estrictamente entre SQL Server y el Centro de distribución de claves, no en Hadoop.
PolyBase no admite relaciones de confianza entre AD y MIT y debe configurarse en el mismo KDC que se configuró en el clúster de Hadoop. En estos entornos, cree manualmente una cuenta de servicio en ese KDC y úsela para realizar la autenticación.
>>> 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.
Punto de comprobación 2
PolyBase intenta acceder a HDFS y produce un error porque la solicitud no contenía el vale de servicio necesario.
[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
Punto de comprobación 3
Un segundo volcado hexadecimal muestra que SQL Server usa correctamente el TGT y obtiene el vale de servicio adecuado para el SPN del nombre del nodo desde el 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 .
Punto de comprobación 4
Por último, las propiedades del archivo de la ruta de acceso de destino se imprimen junto con un mensaje de confirmación. Las propiedades del archivo confirman que SQL Server se autentica mediante Hadoop mediante el ST y concede una sesión para acceder al recurso protegido.
Llegar a este punto confirma que: (i) los tres actores se comunican correctamente, (ii) los core-site.xml y jaas.conf son correctos, y (iii) el KDC reconoce sus credenciales.
[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.
Errores comunes
Si ejecuta la herramienta y las propiedades de archivo de la ruta de acceso de destino no se imprimen (Punto de control 4), una excepción debería lanzarse en mitad del proceso. Revísela y considere el contexto en que se produjo dentro del flujo de cuatro pasos. Tenga en cuenta los siguientes problemas comunes que pueden producirse en orden:
| Excepción y mensajes | Causa |
|---|---|
org.apache.hadoop.security.AccessControlExceptionSIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS] |
El core-site.xml archivo no establece la hadoop.security.authentication propiedad KERBEROSen . |
javax.security.auth.login.LoginExceptionClient not found in Kerberos database (6) - CLIENT_NOT_FOUND |
La principal del servicio de administración no existe en el realm especificado en core-site.xml. |
javax.security.auth.login.LoginExceptionChecksum failed |
La entidad de servicio de administración existe, pero la contraseña es incorrecta. |
Native config name: C:\Windows\krb5.iniLoaded from native config |
Este mensaje indica que el módulo krb5LoginModule de Java ha detectado configuraciones de cliente personalizadas en el equipo. Compruebe la configuración de cliente personalizada, ya que podría estar causando el problema. |
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> |
Agregue la hadoop.security.auth_to_local propiedad a core-site.xml con las reglas adecuadas para el clúster de 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 |
La autenticación en el KDC se realiza correctamente, pero no puede acceder al nodo de nombre de Hadoop. Compruebe el puerto y la dirección IP del nodo de nombre. Compruebe que el firewall esté deshabilitado en Hadoop. |
java.io.FileNotFoundExceptionFile does not exist: /test/data.csv |
La autenticación se realiza correctamente, pero la ubicación especificada no existe. Compruebe primero la ruta de acceso o pruebe con la raíz / . |
Sugerencias de depuración
KDC de MIT
Puede ver todos los SPN registrados con el KDC, incluidos los administradores, ejecutando listprincs>> (cuenta de administrador) en el host de KDC o en cualquier cliente KDC configurado. Si configura Correctamente Kerberos en el clúster de Hadoop, debe haber un SPN para cada servicio disponible en el clúster (por ejemplo: nn, dn, rm, yarn, spnego, etc.). Puede ver sus archivos keytab correspondientes (sustitutos de contraseña) en /etc/security/keytabs, de forma predeterminada. La clave privada KDC cifra estos archivos.
Para comprobar las credenciales de administrador en el KDC localmente, use kinit. Por ejemplo, puede ejecutar kinit identity@MYREALM.COM. Si la identidad existe, se le pedirá una contraseña.
Los registros de KDC están disponibles en /var/log/krb5kdc.log, de forma predeterminada. Los registros incluyen todas las solicitudes de tickets, incluida la dirección IP del cliente que lo solicitó. Debe haber dos solicitudes desde la dirección IP del equipo de SQL Server donde ejecutó la herramienta: primero para el TGT del Servidor de Autenticación como AS_REQ, seguido de un TGS_REQ para el ST del Servidor de Concesión de Tickets.
[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
En Active Directory, puede ver los SPN; para ello, vaya al Panel> de controlUsuarios y equipos de Active Directory y, a continuación, vaya a <MyRealm> y seleccione <MyOrganizationalUnit>. Si configura Correctamente Kerberos en el clúster de Hadoop, hay un SPN para cada servicio disponible en el clúster (por ejemplo: nn, dn, rm, yarn, spnego, etc.).
Sugerencias generales de depuración
Resulta útil tener cierta experiencia de Java para examinar los registros y depurar los problemas de Kerberos, que son independientes de la característica PolyBase de SQL Server.
Si sigue teniendo problemas para acceder a Kerberos, siga estos pasos para depurar:
Asegúrese de que puede acceder a los datos de HDFS de Kerberos desde fuera de SQL Server. Puede:
Escriba su propio programa de Java o use
HdfsBridgela clase de la carpeta de instalación de PolyBase. Por ejemplo:-classpath ".\Hadoop\conf;.\Hadoop\*;.\Hadoop\HDP2_2\*" com.microsoft.polybase.client.HdfsBridge 10.193.27.232 8020 admin_user C:\temp\kerberos_pass.txt
En el ejemplo anterior,
admin_userincluye solo el nombre de usuario, no ninguna parte de dominio.Si no puede acceder a datos de HDFS de Kerberos desde fuera de PolyBase:
Hay dos tipos de autenticación Kerberos: autenticación Kerberos de Active Directory y autenticación Kerberos de MIT.
Asegúrese de que el usuario existe en la cuenta de dominio y use la misma cuenta de usuario al intentar acceder a HDFS.
En el caso de Kerberos de Active Directory, asegúrese de que puede ver el vale en caché con el comando
klisten Windows.Conéctese a la máquina PolyBase y ejecute
klistyklist tgten el símbolo del sistema para verificar si el KDC, el nombre de usuario y los tipos de cifrado son correctos.Si KDC solo puede admitir AES-256, asegúrese de que los archivos de directiva JCE estén instalados.
Contenido relacionado
- Integrating PolyBase with Cloudera using Active Directory Authentication (Integración de PolyBase con Cloudera mediante Autenticación de Active Directory)
- Cloudera's Guide to setting up Kerberos for CDH (Guía de Cloudera para configurar Kerberos para CDH)
- Hortonworks' Guide to Setting up Kerberos for HDP (Guía de Hortonworks para configurar Kerberos para HDP)
- Supervisión y solución de problemas de PolyBase
- Errores de PolyBase y posibles soluciones