Соединение с Kerberrized HDFS, java.lang.IllegalArgumentException: не удалось указать имя участника сервера Kerberos;
Я пытаюсь подключиться к кластеру Kerberized hdfs, с кодом ниже, с тем же кодом ниже, я могу получить доступ к базе данных HBaseConfiguration,
Configuration config = new Configuration();
config.set("hadoop.security.authentication", "Kerberos");
UserGroupInformation.setConfiguration(config);
UserGroupInformation ugi = null;
ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI("me@EXAMPLE>COM","me.keytab");
model = ugi.doAs((PrivilegedExceptionAction<Map<String,Object>>) () -> {
testHadoop(hcb.gethDFSConfigBean());
return null;
});
Я был в состоянии успешно получить доступ к Solr, Impala с той же ключевой таблицей и принципалом, я получаю это странное Не удалось найти имя службы для hdfs.
Пожалуйста, посмотрите ниже трассировки стека
java.io.IOException: Failed on local exception: java.io.IOException: java.lang.IllegalArgumentException: Failed to specify server's Kerberos principal name; Host Details : local host is: "Securonix-int3.local/10.0.4.36"; destination host is: "sobd189.securonix.com":8020;
at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:772)
at org.apache.hadoop.ipc.Client.call(Client.java:1472)
at org.apache.hadoop.ipc.Client.call(Client.java:1399)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:232)
at com.sun.proxy.$Proxy9.getFileInfo(Unknown Source)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getFileInfo(ClientNamenodeProtocolTranslatorPB.java:752)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:187)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
at com.sun.proxy.$Proxy10.getFileInfo(Unknown Source)
at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:1988)
at org.apache.hadoop.hdfs.DistributedFileSystem$18.doCall(DistributedFileSystem.java:1118)
at org.apache.hadoop.hdfs.DistributedFileSystem$18.doCall(DistributedFileSystem.java:1114)
at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1114)
at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1400)
at com.securonix.application.ui.uiUtil.SnyperUIUtil.lambda$main$4(SnyperUIUtil.java:1226)
at com.securonix.application.ui.uiUtil.SnyperUIUtil$$Lambda$6/1620890840.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
at com.securonix.application.ui.uiUtil.SnyperUIUtil.main(SnyperUIUtil.java:1216)
Caused by: java.io.IOException: java.lang.IllegalArgumentException: Failed to specify server's Kerberos principal name
at org.apache.hadoop.ipc.Client$Connection$1.run(Client.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
at org.apache.hadoop.ipc.Client$Connection.handleSaslConnectionFailure(Client.java:643)
at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:730)
at org.apache.hadoop.ipc.Client$Connection.access$2800(Client.java:368)
at org.apache.hadoop.ipc.Client.getConnection(Client.java:1521)
at org.apache.hadoop.ipc.Client.call(Client.java:1438)
... 23 more
Caused by: java.lang.IllegalArgumentException: Failed to specify server's Kerberos principal name
at org.apache.hadoop.security.SaslRpcClient.getServerPrincipal(SaslRpcClient.java:322)
at org.apache.hadoop.security.SaslRpcClient.createSaslClient(SaslRpcClient.java:231)
at org.apache.hadoop.security.SaslRpcClient.selectSaslClient(SaslRpcClient.java:159)
at org.apache.hadoop.security.SaslRpcClient.saslConnect(SaslRpcClient.java:396)
at org.apache.hadoop.ipc.Client$Connection.setupSaslConnection(Client.java:553)
at org.apache.hadoop.ipc.Client$Connection.access$1800(Client.java:368)
at org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:722)
at org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:718)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:717)
После того, как я включил код отладки для Kerberos, я получил приведенный ниже журнал отладки при вызове FileSystem.get(); Журнал отладки Kerberor:
Имя конфигурации Java: null Имя конфигурации Java: null Собственное имя конфигурации: /etc/krb5.conf Собственное имя конфигурации: /etc/krb5.conf Загружается из собственной конфигурации Загружается из собственной конфигурации 16/02/22 15:53:14 WARN util.NativeCodeLoader: невозможно загрузить библиотеку native-hadoop для вашей платформы... с использованием встроенных java-классов, где это применимо
Имя конфигурации Java: null Имя конфигурации Java: null Собственное имя конфигурации: /etc/krb5.conf Собственное имя конфигурации: /etc/krb5.conf Загружается из собственной конфигурации Загружается из собственной конфигурации
KdcAccessibility: сброс >>> KdcAccessibility: сброс KdcAccessibility: сброс >>> KdcAccessibility: сброс KeyTabInputStream, readName(): EXAMPLE.COM >>> KeyTabInputStream, readName(): EXAMPLE.COM KeyTabInputStream, readName(): securonixStint >>> KeyT, readName(): securonix KeyTab: load() длина записи: 55; тип: 23 >>> KeyTab: load() длина записи: 55; тип: 23 KeyTabInputStream, readName(): EXAMPLE.COM >>> KeyTabInputStream, readName(): EXAMPLE.COM KeyTabInputStream, readName(): securonix >>> KeyTabInputStream, readName(): securonix KeyTab: load() длина записи: 71; тип: 18 >>> KeyTab: load() длина записи: 71; Тип: 18 Поиск ключей для: securonix@EXAMPLE.COM Поиск ключей для: securonix@EXAMPLE.COM Добавленный ключ: 18 версия: 1 Добавленный ключ: 18 версия: 1 Добавленный ключ: 23 версия: 1 Добавленный ключ: 23 версия: 1 Поиск ключей for: securonix@EXAMPLE.COM Ищем ключи для: securonix@EXAMPLE.COM Добавлен ключ: 18 версия: 1 Добавлен ключ: 18 версия: 1 Добавлен ключ: 23 версия: 1 Добавлен ключ: 23 версия: 1 тип по умолчанию для default_tkt_enctypes: 18 18 16. Типы по умолчанию для default_tkt_enctypes: 18 18 16. Сообщение создания KrbAsReq >>> Сообщение создания KrbAsReq KrbKdcReq send: kdc=sobd189.securonix.com TCP:88, тайм-аут =30000, количество повторов =3, # байтов =139 >>> KrbKdcReq send: kdc=sobd189.securonix.com TCP:88, тайм-аут =30000, количество повторных попыток =3, # байт =139 KDCC Связь: kdc = sobd189.securonix.com TCP: 88, тайм-аут =30000, попытка =1, # байты =139 >>> KDCCommunication: kdc=sobd189.securonix.com TCP:88, время ожидания =30000, попытка =1, # байт = 139 ОТЛАДКА: TCPClient читает 639 байт >>> ОТЛАДКА: TCPClient читает 639 байт KrbKdcReq send: #bytes read=639 >>> KrbKdcReq send: #bytes read=639 Kdc Доступность: удалить sobd189.securonix.com >>> KdcAccessibility: удалить sobd189.securonix.com Ищем ключи для: securonix@EXAMPLE.COM Ищем ключи for: securonix@EXAMPLE.COM Добавлен ключ: 18 версия: 1 Добавлен ключ: 18 версия: 1 Добавлен ключ: 23 версия: 1 Добавлен ключ: 23 версия: 1 EType: sun.security.krb5.internal.crypto.Aes256CtsHmacSha1EType >>> EType: sun.security.krb5.internal.crypto.Aes256CtsHmacSha1EType KrbAsRep минусы в KrbAsReq.getReply securonix
Интересно, когда я использую API файловой системы, такой как hdfs.exists()
>>>KinitOptions cache name is /tmp/krb5cc_501
>> Acquire default native Credentials
default etypes for default_tkt_enctypes: 18 18 16.
>>> Found no TGT's in LSA
1 ответ
Я полагаю, что проблема заключается в том, что HDFS ожидает, что конфигурация будет иметь значение для dfs.datanode.kerberos.principal, который является основным для datanodes, и в этом случае отсутствует.
У меня была такая же проблема, когда я создал экземпляр конфигурации только из core-site.xml и забыл добавить hdfs-site.xml. Как только я добавил hdfs-site.xml, он начал работать, и hdfs-site.xml имел:
<property>
<name>dfs.datanode.kerberos.principal</name>
<value>....</value>
</property>
Надеюсь это поможет.
У меня была та же проблема с Spark2 и HDP3.1, использующим Isilon/OneFS в качестве хранилища вместо HDFS.
Пакет управления службами OneFS не обеспечивает настройку некоторых параметров HDFS, ожидаемых Spark2 (они вообще недоступны в Ambari), таких как dfs.datanode.kerberos.principal. Без этих параметров Spark2 HistoryServer может не запуститься и сообщить об ошибках, таких как "Не удалось указать основное имя сервера".
Я добавил следующие свойства в OneFS под Custom hdfs-site:
dfs.datanode.kerberos.principal=hdfs/_HOST@<MY REALM>
dfs.datanode.keytab.file=/etc/security/keytabs/hdfs.service.keytab
dfs.namenode.kerberos.principal=hdfs/_HOST@<MY REALM>
dfs.namenode.keytab.file=/etc/security/keytabs/hdfs.service.keytab
Это решило начальную ошибку. После этого я получил ошибку в следующей форме:
Server has invalid Kerberos principal: hdfs/<isilon>.my.realm.com@my.realm.com, expecting: hdfs/somewhere.else.entirely@my.realm.com
Это было связано с межрегиональной аутентификацией. Решено, добавив следующие настройки на пользовательский hdfs-сайт:
dfs.namenode.kerberos.principal.pattern=*