Программный доступ к кластеру Keberized Hadoop

Мы пытаемся получить доступ к керберизованному кластеру 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 была пропущена, а вместо нее была вызвана базовая библиотека JAAS. Похоже, вы неправильно инициализировали статический объект UserGroupInformation или какое-то мошенническое свойство Java препятствует его правильной инициализации. Получайте удовольствие от следующих 4 недель отладки ...

Samson Scharfrichter 02.10.2018 21:46

Обязательно к прочтению: Hadoop и Kerberos, Безумие за воротами - особенно флаги отладки в разделе Секреты низкого уровня

Samson Scharfrichter 02.10.2018 21:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
209
1

Ответы 1

Сначала прочтите комментарии к вашему вопросу. Хорошая вещь.

Сделав шаг назад, поскольку эта информация может быть ошеломляющей, есть два возможных способа аутентификации в кластере 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

Samson Scharfrichter 03.10.2018 22:27

Правда. Я часто забываю, что у нас есть патологический вариант использования (мультитенантный хостинг), который заставляет нас предпринимать дополнительные шаги, о которых большинству сайтов не нужно беспокоиться. На самом деле нам нужно поддерживать обе формы, поскольку клиент может самостоятельно размещать (и, таким образом, обрабатывать все через / etc / hadoop), или они могут использовать наш многопользовательский хостинг (если им просто нужен доступ к стороннему кластеру), ... или они могут самостоятельно размещать и по-прежнему нуждаться в доступе к сторонним кластерам с другой аутентификацией. Счастливой, счастливой, радостной, радостной!

bgiles 04.10.2018 23:42

Другие вопросы по теме