Apache spark 在Kubernetes集群上运行的Spark单机集群中使用Hadoop集群进行Kerberos身份验证
我已经在Kubernetes上建立了Spark独立集群,我正在尝试连接到Kubernetes上没有的Kerberized Hadoop集群。我已经将core-site.xml和hdfs-site.xml放在Spark集群的容器中,并相应地设置了HADOOP_CONF_DIR。我能够在Spark容器中为访问Hadoop集群的主体成功生成kerberos凭据缓存。但当我运行spark submit时,它失败了,worker中出现了低于访问控制的异常注意-船长和工人在单独的Kubernetes吊舱中运行Apache spark 在Kubernetes集群上运行的Spark单机集群中使用Hadoop集群进行Kerberos身份验证,apache-spark,hadoop,kubernetes,kerberos,apache-spark-standalone,Apache Spark,Hadoop,Kubernetes,Kerberos,Apache Spark Standalone,我已经在Kubernetes上建立了Spark独立集群,我正在尝试连接到Kubernetes上没有的Kerberized Hadoop集群。我已经将core-site.xml和hdfs-site.xml放在Spark集群的容器中,并相应地设置了HADOOP_CONF_DIR。我能够在Spark容器中为访问Hadoop集群的主体成功生成kerberos凭据缓存。但当我运行spark submit时,它失败了,worker中出现了低于访问控制的异常注意-船长和工人在单独的Kubernetes吊舱中运
spark-submit --master spark://master-svc:7077 --class myMainClass myApp.jar
Client cannot authenticate via: [TOKEN, KERBEROS]
然而,当我在本地模式下从spark容器运行spark submit时,它能够成功地与Hadoop集群通信
spark-submit --master local[*] --class myMainClass myApp.jar
我是否需要设置任何配置以使工作人员在Spark单机模式下使用凭据缓存 您有一个大问题:AFAIK Spark Standalone不处理任何类型的身份验证
- 在
模式下,Spark客户端/驱动程序/执行程序都位于同一个JVM中,Hadoop客户端libs可以直接访问本地缓存中的Kerberos票证(因此Spark不必管理任何东西)local
- 在
模式下,Spark客户端使用本地Kerberos票证连接到Hadoop服务,并检索特殊的auth令牌,然后将其发送到运行驱动程序的Thread容器中;然后,驱动程序将令牌广播给执行者Thread cluster
- 在
模式中,它与快捷方式类似,因为Spark驱动程序与客户端一起运行,并且令牌已经可用warn-client
- 有了火花,你就完蛋了
spirn-*
模式下从Spark到配置单元或HBase的Kerberos身份验证的更多详细信息,请参阅
参见长时间运行的作业(例如,流)需要从驱动程序内部动态更新Kerberos凭据所需的--principal
和--keytab
参数(因为Spark客户端可能在启动后刚刚终止)
也许您可以尝试
spark.Thread.access.namenodes
,看看这是否会迫使spark客户端获取“其他”Kerberos令牌,但我不会打赌,因为该属性在spark独立模式下可能会被忽略
参见Steve Loughran在上的评论,请注意,访问S3存储桶(通过模拟HDFS的S3A连接器)要简单得多,因为用于身份验证的“机密”由连接器管理,并且对Spark本身完全透明。其他类型的对象存储也一样(Azure、Google、OpenStack Swift)