Hive JDBC проблемы с соединением - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь подключиться к серверу Hive2 через JDBC с аутентификацией Kerberos. После многочисленных попыток заставить его работать, я не могу заставить его работать с драйвером Cloudera.

Если кто-то может помочь мне решить проблему, я очень ценю это.

У меня есть этот метод:

    private Connection establishConnection() {
    final String driverPropertyClassName = "driver";
    final String urlProperty = "url";
    Properties hiveProperties = config.getMatchingProperties("hive.jdbc");
    String driverClassName = (String) hiveProperties.remove(driverPropertyClassName);
    String url = (String) hiveProperties.remove(urlProperty);
    Configuration hadoopConfig = new Configuration();
    hadoopConfig.set("hadoop.security.authentication", "Kerberos");
    String p = config.getProperty("hadoop.core.site.path");
    Path path = new Path(p);
    hadoopConfig.addResource(path);
    UserGroupInformation.setConfiguration(hadoopConfig);

    Connection conn = null;
    if (driverClassName != null) {
        try {
            UserGroupInformation.loginUserFromKeytab(config.getProperty("login.user"), config.getProperty("keytab.file"));
            Driver driver = (Driver) Class.forName(driverClassName).newInstance();
            DriverManager.registerDriver(driver);
            conn = DriverManager.getConnection(url, hiveProperties);
        } catch (Throwable e) {
            LOG.error("Failed to establish Hive connection", e);
        }
    }
    return conn;
}

URL-адрес для сервера, который я получаю из свойств в формате, описанном в документации Cloudera

Я получаю исключение:

2018-05-05 18:26:49 ERROR HiveReader:147 - Failed to establish Hive connection
java.sql.SQLException: [Cloudera][HiveJDBCDriver](500164) Error initialized or created transport for authentication: Peer indicated failure: Unsupported mechanism type PLAIN.
    at com.cloudera.hiveserver2.hivecommon.api.HiveServer2ClientFactory.createTransport(Unknown Source)
    at com.cloudera.hiveserver2.hivecommon.api.ZooKeeperEnabledExtendedHS2Factory.createClient(Unknown Source)
...

Я подумал, что в нем отсутствует атрибут AuthMech, и добавил URL-адрес AuthMech = 1. Теперь я получаю:

java.sql.SQLNonTransientConnectionException: [Cloudera][JDBC](10100) Connection Refused: [Cloudera][JDBC](11640) Required Connection Key(s): KrbHostFQDN, KrbServiceName; [Cloudera][JDBC](11480) Optional Connection Key(s): AsyncExecPollInterval, AutomaticColumnRename, CatalogSchemaSwitch, DecimalColumnScale, DefaultStringColumnLength, DelegationToken, DelegationUID, krbAuthType, KrbRealm, PreparedMetaLimitZero, RowsFetchedPerBlock, SocketTimeOut, ssl, StripCatalogName, transportMode, UseCustomTypeCoercionMap, UseNativeQuery, zk
    at com.cloudera.hiveserver2.exceptions.ExceptionConverter.toSQLException(Unknown Source)
    at com.cloudera.hiveserver2.jdbc.common.BaseConnectionFactory.checkResponseMap(Unknown Source)
    ...

Но KrbHostFQDN уже указано в основном свойстве, как требуется в документации.

Я что-то упустил или эта документация неверна?

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Я хотел поместить его в комментарий, но он был слишком длинным для комментария, поэтому я размещаю его здесь: Я попробовал ваше предложение и получил еще одно исключение:

java.sql.SQLException: [Cloudera] HiveJDBCDriver Ошибка создание контекста входа в систему с использованием кэша билетов: невозможно получить принципал Имя для аутентификации.

Возможно, моя проблема в том, что у меня не установлена ​​переменная окружения KRB5CCNAME. Я, честно говоря, никогда не слышал об этом раньше. Что должно быть в этом билете. Однако в моем основном методе есть следующая строка:

System.setProperty("java.security.krb5.conf", "path/to/krb5.conf");

Который должен использоваться

UserGroupInformation.loginUserFromKeytab(config.getProperty("login.user"), config.getProperty("keytab.file"));

для получения билета Kerberos.

0 голосов
/ 04 августа 2018

Для решения этой проблемы обновите Java Cryptography Extension для версии Java, которую вы используете в своей системе.

  1. Вот ссылка, по которой можно скачать JCE для Java 1.7
  2. Распакуйте и перезапишите эти файлы в $ JDK_HOME / jre / lib / security
  3. Перезагрузите компьютер.
0 голосов
/ 06 мая 2018

Ниже приведен один из подобных типов задач в Impala (только движок JDBC меняет другие так же), который решается путем установки связанных свойств "KrbHostFQDN" в самой строке соединения JDBC.

Попробуйте использовать URL ниже. Надеюсь, у вас работает.

String jdbcConnStr = "jdbc:impala://myserver.mycompany.corp:21050/default;SSL=1;AuthMech=1;KrbHostFQDN=myserver.mycompany.corp;KrbRealm=MYCOMPANY.CORP;KrbServiceName=impala"

Я полагаю, что если вы не используете SSL = 1, а только Kerberos, вы просто удаляете эту часть из строки подключения и не беспокоитесь о настройке SSL-сертификатов в хранилище ключей Java, что является еще одной проблемой.

Однако, чтобы заставить Kerberos работать должным образом, мы сделали следующее:

  • Установите MIT Kerberos 4.0.1, который является менеджером билетов Kerberos. (Это для Windows)

  • Этот менеджер заявок запрашивает аутентификацию каждый раз, когда вы инициируете соединение, создает заявку и сохраняет ее в двоичном файле kerberos_ticket.dat, местоположение которого может быть настроено каким-либо образом, но я не помню точно, как.

  • Наконец, перед запуском приложения JAVA необходимо установить переменную среды KRB5CCNAME=C:/path/to/kerberos_ticket.dat. В вашем java-приложении вы можете проверить, правильно ли установлена ​​переменная, выполнив System.out.println( "KRB5CCNAME = " + System.getenv( "KRB5CCNAME" ) ). Если вы работаете с eclipse или другой IDE, возможно, вам даже придется закрыть IDE, настроить переменную среды и снова запустить IDE.

    • ПРИМЕЧАНИЕ: последний бит очень важен, я заметил, что если эта переменная не установлена ​​должным образом, соединение не будет установлено ...
  • В Linux вместо MIT Kerberos 4.0.1 существует программа kinit, которая делает то же самое, но без графического интерфейса, что еще более удобно для автоматизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...