Apache spark Kerberos:Spark UGI凭据未传递到配置单元

Apache spark Kerberos:Spark UGI凭据未传递到配置单元,apache-spark,hadoop,kerberos,hive-metastore,kerberos-delegation,Apache Spark,Hadoop,Kerberos,Hive Metastore,Kerberos Delegation,我使用的是Spark-2.4,我有一个支持Kerberos的集群,我试图通过Spark sqlshell运行查询 简化的设置基本上如下所示:在一个纱线集群中的一个主机上运行spark sql shell->运行一个主机的外部配置单元元存储->存储表数据的S3 当我在启用调试日志记录的情况下启动sparksqlshell时,我在日志中看到: > bin/spark-sql --proxy-user proxy_user ... DEBUG HiveDelegationTokenProvid

我使用的是Spark-2.4,我有一个支持Kerberos的集群,我试图通过
Spark sql
shell运行查询

简化的设置基本上如下所示:在一个纱线集群中的一个主机上运行spark sql shell->运行一个主机的外部配置单元元存储->存储表数据的S3

当我在启用调试日志记录的情况下启动
sparksql
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调用从配置单元元存储获取委派令牌,然后将其添加到UGI的凭据列表中。在Spark中,它可以做到这一点。我还在元存储日志中验证了正在进行
get\u delegation\u token()
调用

现在,当我运行一个简单的查询时,比如
createtabletest_table(idint)location“s3://some/prefix”我遇到AWS凭据错误。我修改了配置单元元存储代码,并在Hadoop中的文件系统初始化()之前添加了此代码:

但UGI中没有代币。看起来像是用别名
hive.server2.delegation.token添加的,但我在UGI中没有看到它。这让我怀疑UGI范围是隔离的,不能在spark sql和hive metastore之间共享。我该如何解决这个问题?

Spark并没有获取您的Kerberos身份-它要求每个FS发出一些“委派令牌”,让调用者单独与该服务交互。这更受限制,因此更安全

这里的问题是spark从每个可以发出委派令牌的文件系统收集委派令牌——由于您的S3连接器没有发出任何委派令牌,所以没有任何问题


现在,ApacheHadoop3.3.0的S3A连接器可以设置为在委派令牌中颁发AWS凭据,或者,为了额外的安全性,向AWS请求会话凭据并仅发送这些凭据。但是(a)您需要一个具有这些依赖项的spark构建,以及(b)Hive需要使用这些凭据与S3通信

请接受我对查看UGI代码的哀悼。有些事情是人类不应该看到的。UGI和下面的kerberos层符合要求。
 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 information: proxy_user (auth:PROXY) via hive/hive-metastore@REALM.COM (auth:KERBEROS)