Мы пытаемся получить доступ к керберизованному кластеру Hadoop (дистрибутив Cloudera) с помощью кода (java), но получаем следующее исключение.
Caused by: javax.security.auth.login.LoginException: Unable to obtain password from user at com.sun.security.auth.module.Krb5LoginModule.promptForPass(Krb5LoginModule.java:897) at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5Login Module.java:760) at com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:617)
Мы использовали свойство hadoop.security.authentication как kerberos, fs.defaultFS как hdfs://devha:8020 и передали путь keytabfilepath в группе userinformationgroup.
Обязательно к прочтению: Hadoop и Kerberos, Безумие за воротами - особенно флаги отладки в разделе Секреты низкого уровня




Сначала прочтите комментарии к вашему вопросу. Хорошая вещь.
Сделав шаг назад, поскольку эта информация может быть ошеломляющей, есть два возможных способа аутентификации в кластере Hadoop. Пользователь обычно использует имя пользователя (принципала) и пароль. заявление обычно использует принципала и файл keytab. Файл keytab создается администратором Kerberos с помощью приложения kadmin.
Кроме того, существует концепция пользователя «Вход в систему» - пользователя по умолчанию для всего приложения или «Текущего» пользователя, который может соответствовать вашим текущим потребностям. Вы часто будете использовать первое для доступа к ресурсам в локальном кластере, а второе - для доступа к ресурсам внешнего кластера.
Поскольку я использую последнее, я могу дать вам небольшой фрагмент кода, чтобы вы начали. Для инициализации:
UserGroupInformation.setConfiguration (конфигурация);
где «конфигурация» либо считывается из стандартного расположения (/ etc / hadoop), либо генерируется «на лету». Обратите внимание - это устанавливает статическое значение, поэтому вам нужно быть очень осторожным!
Для индивидуального пользователя (приложения) использую
UserGroupApplication user = UserGroupInformation.loginUserFromKeytabAndReturnUGI(principal, keytabFile);
Есть несколько вариантов этого метода - например, берут ли они имя пользователя или файл keytab? Устанавливают ли они пользователя для входа в систему или возвращают новый объект UserGroupInformation? Будьте осторожны, вы понимаете последствия того, какой из них вы используете, поскольку некоторые устанавливают глобальные значения.
Теперь вы должны заключить свои вызовы в кластер в вызове doAs ():
user.doAs(new PrivilegedExceptionAction<Void>() {
public Void run() throws Exception {
// do all of your hadoop calls here
return null;
}
}
Я не помню, нужно ли вам это делать, если вы всегда используете пользователя «Вход». Нам необходимо поддерживать как локальные, так и внешние кластеры, и для нас проще всего всегда оборачивать все таким образом. Это означает, что нам нужно установить «пользователя» только один раз, в начале действия.
См. Упомянутые выше ресурсы, если вам нужна подробная информация о олицетворении пользователя, использовании SSL-шифрования (rpc.privacy) и т. д.
Nit: AFAIK, loginUserFromKeytabAndReturnUGI полезен только в том случае, если вам нужно несколько кредитов Kerberos в параллели. В противном случае вам просто нужно инициализировать объект статический UGI с помощью loginUserFromKeytab ... затем пропустить раздражающие вещи doAs
Правда. Я часто забываю, что у нас есть патологический вариант использования (мультитенантный хостинг), который заставляет нас предпринимать дополнительные шаги, о которых большинству сайтов не нужно беспокоиться. На самом деле нам нужно поддерживать обе формы, поскольку клиент может самостоятельно размещать (и, таким образом, обрабатывать все через / etc / hadoop), или они могут использовать наш многопользовательский хостинг (если им просто нужен доступ к стороннему кластеру), ... или они могут самостоятельно размещать и по-прежнему нуждаться в доступе к сторонним кластерам с другой аутентификацией. Счастливой, счастливой, радостной, радостной!
Сообщение об ошибке указывает на то, что библиотека аутентификации Hadoop была пропущена, а вместо нее была вызвана базовая библиотека JAAS. Похоже, вы неправильно инициализировали статический объект
UserGroupInformationили какое-то мошенническое свойство Java препятствует его правильной инициализации. Получайте удовольствие от следующих 4 недель отладки ...