我使用的是Spark2.4,我有一个启用Kerberos的集群,在这里我试图通过spark-sql
shell运行一个查询。
简化的设置基本如下所示: shell运行在Yarn集群中的一个主机上,->外部单元-亚稳态运行一个主机-> 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)
这意味着斯派克打了个电话,从蜂巢转移处拿出委托令牌,然后把它添加到UGI的凭证列表中。火星城的这是一段代码就是这么做的。我还在亚稳态日志中证实了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中没有任何标记。看起来像火花码用别名hive.server2.delegation.token
添加了它,但是我在UGI中没有看到它。这让我怀疑UGI的作用域是孤立的,不能在spark和蜂巢转移之间共享。我该怎么解决这个问题?
发布于 2020-04-23 08:30:47
星星之火没有获取您的Kerberos标识,-it要求每个FS发出一些“委托令牌”,让调用者单独与该服务和该服务进行交互。这更受限制,也更安全。
这里的问题是,spark从每个文件系统收集委托令牌,这些令牌可以发出-and,因为您的S3连接器没有发出任何令牌,也没有下降的迹象。
现在,可以将ApacheHadoop3.3.0的S3A连接器设置为在委托令牌内发出AWS凭据,或者为了额外的安全性,请AWS提供会话凭据,然后只发送这些凭据。但是(a)您需要一个带有这些依赖项的星星之火构建,以及(b) Hive需要使用这些凭据与S3对话。
https://stackoverflow.com/questions/61355997
复制