Я использую 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 решить эту проблему?