apache-spark - Kerberos:Spark UGI 凭据没有传递给 Hive

标签 apache-spark hadoop kerberos hive-metastore kerberos-delegation

我正在使用 Spark-2.4,我有一个启用 Kerberos 的集群,我试图通过 spark-sql 运行查询贝壳。

简化的设置基本上如下所示:在 Yarn 集群中的一台主机上运行的 spark-sql shell -> 运行一台主机的外部 hive-metastore -> 用于存储表数据的 S3。

当我启动 spark-sql启用了调试日志记录的 shell,这是我在日志中看到的:

> 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 元存储中获取委托(delegate) token ,然后将其添加到 UGI 的凭据列表中。 This is the piece of code在 Spark 中做到了这一点。我还在 Metastore 日志中验证了 get_delegation_token()正在调用电话。

现在,当我运行像 create table test_table (id int) location "s3://some/prefix"; 这样的简单查询时我遇到 AWS 凭证错误。我修改了配置单元元存储代码并在 Hadoop 中的文件系统初始化之前添加了这个代码 (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 code添加别名 hive.server2.delegation.token但我在 UGI 中看不到它。这让我怀疑 UGI 范围以某种方式被隔离并且没有在 spark-sql 和 hive 元存储之间共享。我该如何解决这个问题?

最佳答案

Spark 不会获取您的 Kerberos 身份 - 它要求每个 FS 发布一些“委托(delegate) token ”,让调用者与该服务和该服务单独交互。这更受限制,因此更安全。

这里的问题是,spark 从每个可以发布它们的文件系统中收集委托(delegate) token ——并且由于您的 S3 连接器没有发布任何 token ,因此没有任何问题出现。

现在,可以将 Apache Hadoop 3.3.0 的 S3A 连接器设置为在委托(delegate) token 内发布您的 AWS 凭证,或者为了额外的安全性,向 AWS 索取 session 凭证并仅发送这些凭证。但是 (a) 您需要具有这些依赖项的 spark 构建,并且 (b) Hive 需要使用这些凭据与 S3 通信。

关于apache-spark - Kerberos:Spark UGI 凭据没有传递给 Hive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61355997/

相关文章:

macos - SSH 在 Mac Book Pro 上挂起; AFS 和网络首选项?

sql-server - 目标主体名称不正确。无法生成 SSPI 上下文

java - Kerberos 票证验证的功能测试

python - 在 hive 或 pyspark 中透视日志

java - 遇到无法在 pyspark 上运行程序的错误

hadoop - hadoop 存储文件的位置,以便以编程方式通过 HDFS 进行读写

java - 在Windows 7 64位和Java 8上构建hadoop 2.6.0时出现问题

apache-spark - 删除每个分区的重复项

java - 为什么 Spark 运行时内存少于可用内存?

hadoop - 如何部署和运行 oozie 作业?