在远程集群上从 Spark 运行 hive 查询时,客户端无法通过以下方式进行身份验证:[TOKEN, KERBEROS]

Posted

技术标签:

【中文标题】在远程集群上从 Spark 运行 hive 查询时,客户端无法通过以下方式进行身份验证:[TOKEN, KERBEROS]【英文标题】:Client cannot authenticate via: [TOKEN, KERBEROS] when running hive query from Spark on a remote cluster 【发布时间】:2020-06-30 16:04:45 【问题描述】:

我们有一个设置,我们有 2 个集群,生产集群 A 和开发集群 B。在集群 B 中,创建 Hive 表指向集群 A 中的 HDFS (https://docs.cloudera.com/HDPDocuments/HDP2/HDP-2.6.5/bk_data-access/content/querying-remote-clusters.html)。我们可以成功查询集群 B 中的表并按预期返回数据(存储在集群 A 中的记录),然后我们有一些 PySpark 代码可以使用以下方式查询表:

sqlContext.sql("query tables in B that point to HDFS in A") 

该代码在交互式 PySpark 会话中运行良好,但是当作为批处理作业运行时,我们得到:

org.apach.hadoop.security.AccessControlException: Client cannot authenticate via: [TOKEN,KERBEROS]

鉴于它在交互模式下工作,在我看来,某种类型的配置或权限(或者可能是 Kerberos)可以修复它,但支持团队中的一些成员认为这是 Spark 的一个无法修复的限制,我们如何才能做到这一点2 个集群和 1 个开发集群指向另一个生产集群中的 HDFS 是否使用批处理 Spark 代码?

【问题讨论】:

你是在使用 spark submit 命令执行 spark 吗?? 它是 spark-submit 之上的自定义包装器,但是是的,最终它通过 spark-submit。 我认为您的集群启用了 kerberos,您是否将 keytab 文件传递​​给 spark-submit ? 是的,它们启用了 kerberos,并且不确定是否会传递 keytab,我是最终用户,我使用自定义包装器,所以我只提供脚本和命令行参数给它,我'将尝试从支持/管理团队获得输入。 大多数情况下,我们通过 spark-submit --conf spark.yarn.keytab=/path/to/<service_account>.keytab & --conf spark.yarn.principal=principal@REALM.COM 传递这两个配置 【参考方案1】:

解决此问题的方法是添加以下配置:

.config("spark.yarn.access.namenodes", "hdfs://cluster_A") 

【讨论】:

以上是关于在远程集群上从 Spark 运行 hive 查询时,客户端无法通过以下方式进行身份验证:[TOKEN, KERBEROS]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spark 查询位于远程集群上的 Hive 数据

本地Spark连接远程集群Hive(Scala/Python)

hive查询为啥在yarn上看不到

二次开发Spark实现JDBC读取远程租户集群Hive数据并落地到本集群Hive的Hive2Hive数据集成Java

二次开发Spark实现JDBC读取远程租户集群Hive数据并落地到本集群Hive的Hive2Hive数据集成Java

通过 Pyspark 查询 Hive 返回空结果