Kerberos: учетные данные Spark UGI не передаются в Hive - PullRequest
1 голос
/ 22 апреля 2020

Я использую Spark-2.4, у меня есть кластер с поддержкой Kerberos, где я пытаюсь выполнить запрос через оболочку spark-sql.

Упрощенная установка в основном выглядит следующим образом: оболочка spark- sql, работающая на одном хосте в кластере Yarn -> внешнее хранилище-метастор, работающее на одном хосте -> S3 для хранения данных таблицы.

Когда я запускаю оболочку spark-sql с включенным ведением журнала DEBUG, я вижу это в журналах:

> bin/spark-sql --proxy-user proxy_user

...
DEBUG HiveDelegationTokenProvider: Getting Hive delegation token for proxy_user against hive/_HOST@REALM.COM at thrift://hive-metastore:9083
DEBUG UserGroupInformation: PrivilegedAction as:spark/spark_host@REALM.COM (auth:KERBEROS) from:org.apache.spark.deploy.security.HiveDelegationTokenProvider.doAsRealUser(HiveDelegationTokenProvider.scala:130)

Это означает, что Spark сделал вызов для получения токена делегирования из метасчет Hive, а затем добавил его в список учетных данных для UGI. Это фрагмент кода в Spark, который делает это. Я также проверил в журналах метастазов, что звонил get_delegation_token().

Теперь, когда я запускаю простой запрос, такой как create table test_table (id int) location "s3://some/prefix";, я получаю сообщение об ошибке AWS учетных данных. Я изменил код метастаза куста и добавил его прямо перед инициализацией файловой системы в Had oop ( org / apache / hadoop / hive / metastore / Warehouse. java):

 public static FileSystem getFs(Path f, Configuration conf) throws MetaException {
...
    try {
      // get the current user 
      UserGroupInformation ugi = UserGroupInformation.getCurrentUser();
      LOG.info("UGI information: " + ugi);
      Collection<Token<? extends TokenIdentifier>> tokens = ugi.getCredentials().getAllTokens();
      // print all the tokens it has 
      for(Token token : tokens) {
        LOG.info(token);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
...
}

В журналах метастазов выводятся правильные данные UGI:

UGI information: proxy_user (auth:PROXY) via hive/hive-metastore@REALM.COM (auth:KERBEROS)

, но в UGI нет токенов. Похоже, Spark-код добавляет его с псевдонимом hive.server2.delegation.token, но я не вижу его в UGI. Это заставляет меня подозревать, что область видимости UGI каким-то образом изолирована и не используется совместно с spark- sql и метасредством улья. Как мне go решить эту проблему?

1 Ответ

0 голосов
/ 23 апреля 2020

Spark - это , а не при получении вашей идентификации Kerberos - он просит каждую ФС выдать некоторый «маркер делегирования», который позволяет вызывающей стороне взаимодействовать с этой службой и только с этой службой . Это более ограничено и поэтому более безопасно.

Проблема здесь в том, что spark собирает токены делегирования из каждой файловой системы, которая может их выдать, а поскольку ваш S3-соединитель не выдает никаких, ничего не происходит.

Теперь можно установить Apache Если бы S3A-соединитель oop 3.3.0 выдавал ваши AWS учетные данные внутри токена делегирования или, для обеспечения безопасности бонуса, запрашивал AWS учетные данные сеанса и отправлял только те над. Но (а) вам нужна искровая сборка с этими зависимостями, и (б) Hive должен использовать эти учетные данные для связи с S3.

...