Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к: SQL Server 2016 (13.x) и более поздних версий в Windows
Чтобы устранить неполадки проверки подлинности при использовании PolyBase с кластером Hadoop, защищенным Kerberos, используйте интерактивную диагностику, встроенную в PolyBase.
В этой статье описывается процесс отладки таких проблем с помощью встроенной диагностики.
Совет
При сбое HDFS Kerberos при создании внешней таблицы в защищенном кластере HDFS Kerberos можно запустить средство тестирования Kerberos HDFS для устранения неполадок подключений Kerberos HDFS для PolyBase.
Это средство помогает исключить проблемы, отличные от SQL Server, поэтому вы можете сосредоточиться на разрешении проблем установки Kerberos HDFS. Это помогает выявить проблемы с неправильной настройкой имени пользователя и пароля, а также неправильно настроенные конфигурации кластера Kerberos.
Это средство не зависит от SQL Server. Он доступен в качестве записной книжки Jupyter.
Необходимые компоненты
SQL Server 2016 (13.x) RTM CU6, SQL Server 2016 (13.x) с пакетом обновления 1 (SP1) CU3 или SQL Server 2017 (14.x) и более поздние версии с установленным PolyBase
Кластер Hadoop (Cloudera или Hortonworks), защищенный с помощью Kerberos (Active Directory или MIT)
Введение
В первую очередь рекомендуется понять, как происходит работа протокола Kerberos на высоком уровне. Участвуют три субъекта:
- клиент Kerberos (SQL Server);
- Защищенный ресурс (HDFS, MR2, YARN, журнал заданий и другие)
- центр распространения ключей (называемый в Active Directory контроллером домена).
При настройке Kerberos в кластере Hadoop необходимо зарегистрировать каждый защищенный ресурс Hadoop в Центре распространения ключей (KDC) с уникальным именем субъекта-службы (SPN). Клиент должен получить временный билет пользователя, называемый билетом предоставления билета (TGT), поэтому он может запросить другой временный билет, называемый билетом службы (ST), из KDC для конкретного субъекта-службы, к которому он хочет получить доступ.
В PolyBase при запросе аутентификации к любому ресурсу, защищенному Kerberos, осуществляется следующий четырехэтапный процесс:
SQL Server подключается к KDC и получает TGT для пользователя. Закрытый ключ KDC шифрует TGT.
Затем SQL Server вызывает защищенный ресурс Hadoop (HDFS) и определяет, для какого имени субъекта-службы требуется билет службы.
SQL Server возвращает центру распространения ключей билет на получение билетов, а затем запрашивает у него билет службы для доступа к нужному защищенному ресурсу. Закрытый ключ защищённой службы шифрует ST.
SQL Server переадресовывает билет службы в Hadoop и проходит аутентификацию, необходимую для создания сеанса с этой службой.
Проблемы с проверкой подлинности попадают в одну или несколько предыдущих шагов. Чтобы ускорить отладку, PolyBase предоставляет интегрированное средство диагностики, помогающее определить точку сбоя.
Устранение неполадок
PolyBase использует следующие XML-файлы конфигурации для хранения свойств кластера Hadoop:
core-site.xmlhdfs-site.xmlhive-site.xmljaas.confmapred-site.xmlyarn-site.xml
Эти файлы можно найти в следующем пути:
[System Drive]:{install path}{MSSQL##.INSTANCENAME}\MSSQL\Binn\PolyBase\Hadoop\conf
Например, путь по умолчанию для SQL Server 2016 (13.x) — это C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase\Hadoop\conf.
Измените core-site.xml и добавьте эти свойства. Задайте значения в соответствии с вашей средой:
<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>
Примечание.
Значение свойства polybase.kerberos.realm должно быть заглавными буквами.
Чтобы включить операции pushdown, необходимо обновить другие XML-файлы. Доступ к файловой системе HDFS можно получить, настроив этот файл.
Средство выполняется независимо от SQL Server, поэтому его не нужно запускать. При обновлении XML-файлов конфигурации не нужно перезапустить его. Для запуска инструмента выполните на хост-компьютере с установленным SQL Server следующие команды:
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)}
В SQL Server 2019 (15.x) и более поздних версиях при установке компонента PolyBase можно ссылаться на существующую среду выполнения Java или установить AZUL-OpenJDK-JRE. Если выбрать AZUL-OpenJDK-JRE, java.exe не является частью переменной среды $PATH, и вы можете столкнуться с ошибкой.
'java' isn't recognized as an internal or external command, operable program or batch file.
Если эта ошибка возникает, добавьте путь к java.exe переменной среды сеанса $PATH . По умолчанию используется C:\Program Files\Microsoft SQL Server\MSSQL15.<instance name>\AZUL-OpenJDK-JRE\binпуть установки исполняемого файла Java. Если это путь, необходимо выполнить следующую команду перед выполнением java команды, чтобы запустить средство устранения неполадок подключения Kerberos.
set PATH=%PATH%;C:\Program Files\Microsoft SQL Server\MSSQL15.{instance name}\AZUL-OpenJDK-JRE\bin
Аргументы
| Аргумент | Description |
|---|---|
| Адрес узла имен | IP-адрес или полное доменное имя узла имен. Ссылается на аргумент LOCATION в CREATE EXTERNAL DATA SOURCE Transact-SQL.
Примечание: версия средства SQL Server 2019 требует, чтобы перед IP-адресом или полным доменным именем стоял hdfs://. |
| Порт узла имен | Соответствует порту узла имен. Ссылается на аргумент LOCATION в вашем CREATE EXTERNAL DATA SOURCE T-SQL. Например, 8020. |
| Субъект-служба | Субъект-служба администрирования для вашего центра распространения ключей. Соответствует аргументу IDENTITY в CREATE DATABASE SCOPED CREDENTIAL T-SQL. |
| Пароль службы | Вместо того, чтобы вводить пароль в консоли, сохраните его в файле и передайте сюда путь. Содержимое файла должно совпадать с тем, что вы указываете в качестве аргумента SECRET в CREATE DATABASE SCOPED CREDENTIAL T-SQL. |
| Путь к файлу на удаленной HDFS (необязательно) | Путь для доступа к существующему файлу. Если не указано, используется корневая папка (/). |
Примеры
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
Выходные данные подробные и предназначены для расширенной отладки, но есть только четыре основные контрольные точки, которые необходимо учесть, независимо от того, используете ли вы MIT или AD. Они соответствуют четырем шагам, описанным ранее.
Следующие фрагменты получены при работе с центром распространения ключей MIT. Полные выходные данные из MIT и AD см. в конце этой статьи в связанном содержимом.
Контрольная точка 1
В выходных данных должен быть шестнадцатеричный дамп билета со значением Server Principal = krbtgt/MYREALM.COM@MYREALM.COM. Его наличие показывает, что сервер SQL Server успешно прошел проверку подлинности в центре распространения ключей и ему был предоставлен билет на получение билетов. Если такого дампа нет, проблема лежит строго между SQL Server и центром и Hadoop здесь ни при чем.
PolyBase не поддерживает доверительные отношения между AD и MIT и должен быть настроен через тот же KDC, который используется в кластере Hadoop. В таких средах вручную создайте учетную запись службы в этом KDC и используйте ее для проверки подлинности.
>>> 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.
Контрольная точка 2
PolyBase пытается получить доступ к HDFS и не удаётся, так как запрос не содержал необходимый служебный билет.
[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
Контрольная точка 3
Второй шестнадцатеричный дамп показывает, что SQL Server успешно использует TGT и получает правильный билет службы для имени субъекта-службы узла из 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 .
Контрольная точка 4
Наконец, свойства файла целевого пути печатаются вместе с сообщением подтверждения. Свойства файла подтверждают, что SQL Server проходит проверку подлинности Hadoop с помощью ST и предоставляет сеанс для доступа к защищенному ресурсу.
В этом случае подтверждается, что: (i) три субъекта правильно взаимодействуют, (ii) core-site.xml и jaas.conf являются правильными, и (iii) ваш KDC распознает ваши учетные данные.
[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.
Распространенные ошибки
Если запустить средство и свойства файла целевого пути не печатаются (Контрольная точка 4), на середине выполнения возникает исключение. Просмотрите исключение и рассмотрите контекст того, где в четырехэтапном потоке он произошел. Рассмотрим следующие распространенные проблемы, которые могут возникнуть, в порядке:
| Исключение и сообщения | Причина |
|---|---|
org.apache.hadoop.security.AccessControlExceptionSIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS] |
Файл core-site.xml не задает свойству hadoop.security.authentication значение KERBEROS. |
javax.security.auth.login.LoginExceptionClient not found in Kerberos database (6) - CLIENT_NOT_FOUND |
Субъект-служба администратора не существует в области, указанной в core-site.xml. |
javax.security.auth.login.LoginExceptionChecksum failed |
Субъект-служба администрирования существует, но отправлен неправильный пароль. |
Native config name: C:\Windows\krb5.iniLoaded from native config |
Это сообщение указывает, что модуль Java krb5LoginModule обнаружил на вашем компьютере настроенные конфигурации клиента. Проверьте пользовательские параметры клиента, так как они могут вызвать проблему. |
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> |
Добавьте свойство hadoop.security.auth_to_local к core-site.xml в соответствии с правилами кластера 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 |
Проверка подлинности в KDC завершается успешно, но не удается получить доступ к узлу имен Hadoop. Проверьте IP-адрес и порт узла имен. На Hadoop не должен работать брандмауэр. |
java.io.FileNotFoundExceptionFile does not exist: /test/data.csv |
Проверка подлинности успешно выполнена, но указанное расположение не существует. Сначала проверьте путь или протестируйте с правами root / . |
Советы по отладке
Центр распространения ключей MIT
Все SPN, зарегистрированные в KDC, включая администраторов, можно просмотреть, выполнив kadmin.local> (учетная запись администратора) >listprincs на узле KDC или любом настроенном клиенте KDC. Если вы правильно настроите Kerberos в кластере Hadoop, для каждой доступной в кластере службы существует один SPN (например, nn, dn, rm, yarn, spnego и т. д.). Соответствующие файлы keytab (замены паролей) можно просмотреть в каталоге /etc/security/keytabs по умолчанию. Закрытый ключ KDC шифрует эти файлы.
Чтобы проверить учетные данные администратора в KDC локально, используйте kinit. Например, можно запустить kinit identity@MYREALM.COM. Если идентификация существует, вам будет предложено ввести пароль.
Журналы KDC по умолчанию доступны в /var/log/krb5kdc.log. Журналы включают все запросы на билеты, включая IP-адрес клиента, который сделал запрос. С IP-адреса компьютера SQL Server, на котором вы запустили средство, поступают два запроса: сначала запрос на TGT с сервера проверки подлинности в качестве AS_REQ, а затем TGS_REQ запрос на ST с сервера выдачи билетов.
[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
В Active Directory можно просмотреть имена служб/пользователей (SPN), перейдя в Панель управления> и выбрав Пользователи и компьютеры Active Directory, затем перейти к <MyRealm> и выбрать <MyOrganizationalUnit>. Если вы правильно настроите Kerberos в кластере Hadoop, для каждой доступной в кластере службы существует один SPN (например, nn, dn, rm, yarn, spnego и т. д.).
Общие советы по отладке
Полезно иметь некоторый опыт работы с Java для анализа журналов и отладки проблем Kerberos, которые не зависят от возможности PolyBase в SQL Server.
Если у вас по-прежнему возникают проблемы с доступом к Kerberos, выполните следующие действия, чтобы выполнить отладку:
Убедитесь, что вы можете получить доступ к данным Kerberos HDFS извне SQL Server. Вы можете сделать одно из двух:
Напишите собственную программу Java или используйте
HdfsBridgeкласс из папки установки PolyBase. Например:-classpath ".\Hadoop\conf;.\Hadoop\*;.\Hadoop\HDP2_2\*" com.microsoft.polybase.client.HdfsBridge 10.193.27.232 8020 admin_user C:\temp\kerberos_pass.txt
В предыдущем примере
admin_userсодержит только имя пользователя , а не часть домена.Если вы не можете получить доступ к данным Kerberos HDFS извне PolyBase:
Существует два типа проверки подлинности Kerberos: проверка подлинности Kerberos Active Directory и проверка подлинности MIT Kerberos.
Убедитесь в том, что пользователь имеется в учетной записи домена, и используйте ту же учетную запись пользователя при попытке доступа к HDFS.
Если применяется проверка подлинности Kerberos в Active Directory, убедитесь в том, что при использовании команды
klistв Windows отображается кэшированный билет.Подключитесь к компьютеру PolyBase и запустите
klistиklist tgtв командной строке, чтобы проверить, правильны ли KDC, имя пользователя и типы шифрования.Если KDC может поддерживать только AES-256, убедитесь, что установлены файлы политики JCE .
Связанный контент
- Integrating PolyBase with Cloudera using Active Directory Authentication (Интеграция PolyBase и Cloudera с помощью аутентификации Active Directory)
- Руководство Cloudera по настройке Kerberos для CDH
- Руководство Hortonworks по настройке Kerberos для HDP
- Мониторинг и устранение неполадок PolyBase
- Ошибки в PolyBase и возможные решения