Apache spark Kerberos:Spark UGI凭据未传递到配置单元
我使用的是Spark-2.4,我有一个支持Kerberos的集群,我试图通过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 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)