Программный доступ к кластеру Keberized Hadoop - PullRequest
0 голосов
/ 02 октября 2018

Мы пытаемся получить доступ к керберизованному кластеру Hadoop (дистрибутив Cloudera), используя код (java), но получаем следующее исключение.

Причина: javax.security.auth.login.LoginException: Unableполучить пароль от пользователя в com.sun.security.auth.module.Krb5LoginModule.promptForPass (Krb5LoginModule.java:897) в com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication (Krb5Login Module.java: 7): 7.sun.security.auth.module.Krb5LoginModule.login (Krb5LoginModule.java:617)

Мы использовали свойство hadoop.security.authentication как kerberos, fs.defaultFS как hdfs://devha:8020 и передал путь к ключевому файлу в пользовательской информационной группе.

1 Ответ

0 голосов
/ 03 октября 2018

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

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

...