gpt4 book ai didi

docker - 在 Kubernetes 上运行 Spark 访问 kerberized Hadoop 集群时,如何解决执行器上的 "SIMPLE authentication is not enabled"错误?

转载 作者:行者123 更新时间:2023-12-02 17:31:03 26 4
gpt4 key购买 nike

我正在尝试在 Kubernetes 上运行 Spark,目的是处理来自 Kerberized Hadoop 集群的数据。我的应用程序由简单的 SparkSQL 转换组成。虽然我能够在单个驱动程序 Pod 上成功运行该进程,但在尝试使用任何执行程序时却无法执行此操作。相反,我得到:

org.apache.hadoop.security.AccessControlException: SIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS]

由于 Hadoop 环境是 Kerberized,因此我提供了有效的 keytab,以及 core-site.xml、hive-site.xml、hadoop-site.xml、mapred-site.xml 和yarn-site。 xml 和 docker 镜像内的 krb5.conf 文件。

我使用以下方法设置环境设置:

trait EnvironmentConfiguration {

def configureEnvironment(): Unit = {
val conf = new Configuration
conf.set("hadoop.security.authentication", "kerberos")
conf.set("hadoop.security.authorization", "true")
conf.set("com.sun.security.auth.module.Krb5LoginModule", "required")
System.setProperty("java.security.krb5.conf", ConfigurationProperties.kerberosConfLocation)
UserGroupInformation.loginUserFromKeytab(ConfigurationProperties.keytabUser, ConfigurationProperties.keytabLocation)
UserGroupInformation.setConfiguration(conf)
}

我还通过以下方法传递*-site.xml文件:

trait SparkConfiguration {

def createSparkSession(): SparkSession = {
val spark = SparkSession.builder
.appName("MiniSparkK8")
.enableHiveSupport()
.master("local[*]")
.config("spark.sql.hive.metastore.version", ConfigurationProperties.hiveMetastoreVersion)
.config("spark.executor.memory", ConfigurationProperties.sparkExecutorMemory)
.config("spark.sql.hive.version", ConfigurationProperties.hiveVersion)
.config("spark.sql.hive.metastore.jars",ConfigurationProperties.hiveMetastoreJars)
spark.sparkContext.hadoopConfiguration.addResource(new Path(ConfigurationProperties.coreSiteLocation))
spark.sparkContext.hadoopConfiguration.addResource(new Path(ConfigurationProperties.hiveSiteLocation))
spark.sparkContext.hadoopConfiguration.addResource(new Path(ConfigurationProperties.hdfsSiteLocation))
spark.sparkContext.hadoopConfiguration.addResource(new Path(ConfigurationProperties.yarnSiteLocation))
spark.sparkContext.hadoopConfiguration.addResource(new Path(ConfigurationProperties.mapredSiteLocation))
}
}

我使用以下 Spark-submit 命令运行整个过程:

spark-submit ^
--master k8s://https://kubernetes.example.environment.url:8443 ^
--deploy-mode cluster ^
--name mini-spark-k8 ^
--class org.spark.Driver ^
--conf spark.executor.instances=2 ^
--conf spark.kubernetes.namespace=<company-openshift-namespace> ^
--conf spark.kubernetes.container.image=<company_image_registry.image> ^
--conf spark.kubernetes.driver.pod.name=minisparkk8-cluster ^
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark ^
local:///opt/spark/examples/target/MiniSparkK8-1.0-SNAPSHOT.jar ^
/opt/spark/mini-spark-conf.properties

上述配置足以让我的 Spark 应用程序运行并成功连接到 Kerberized Hadoop 集群。尽管 Spark Submit 命令声明创建了两个执行程序 Pod,但这并没有发生,因为我已将 master 设置为 local[*]。因此,只创建了一个 pod,它能够连接到 Kerberized Hadoop 集群并成功在 Hive 表上运行我的 Spark 转换。

但是,当我删除 .master(local[*]) 时,会创建两个执行程序 Pod。从日志中可以看到这些执行器已成功连接到驱动程序 Pod,并且它们被分配了任务。此后不久,它们都会因上述错误而失败,导致失败的执行程序 Pod 被终止。尽管执行者已经拥有所有必要的文件来创建与其镜像内的 Kerberized Hadoop 的成功连接。我相信执行者没有使用 key 表,如果他们运行 JAR,他们就会这样做。相反,他们正在运行驱动程序分配给他们的任务。

我可以从日志中看到驱动程序成功地使用用户 USER123 的 key 表对自身进行了正确的身份验证:

INFO SecurityManager:54 - SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(spark, USER123); groups with view permissions: Set(); users with modify permissions: Set(spark, USER123); groups with modify permissions: Set()

另一方面,您从执行程序的日志中得到以下内容,您可以看到该用户 USER123 未经过身份验证:

INFO SecurityManager:54 - SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(spark); groups with view permissions: Set(); users with modify permissions: Set(spark); groups with modify permissions: Set()

我查看了各种来源,包括 here 。它提到需要定义 HIVE_CONF_DIR ,但我可以从我的程序(打印环境变量)中看到该变量不存在,包括当驱动程序 pod 设法对自身进行身份验证并运行 Spark 时工艺精细。

我尝试在之前的 Spark-submit 命令中添加以下内容来运行:

--conf spark.kubernetes.kerberos.enabled=true ^
--conf spark.kubernetes.kerberos.krb5.path=/etc/krb5.conf ^
--conf spark.kubernetes.kerberos.keytab=/var/keytabs/USER123.keytab ^
--conf spark.kubernetes.kerberos.principal=USER123@REALM ^

但这没有什么区别。

我的问题是:如何让执行者使用镜像中的 key 表对自己进行身份验证?我希望这将使他们能够执行委托(delegate)的任务。

最佳答案

首先使用以下命令从 hadoop 获取委托(delegate) token 。

  1. 使用您的 key 表和主体执行 kinit -kt
  2. 执行以下命令将 hdfs 委托(delegate) token 存储在 tmp 路径中 spark-submit --class org.apache.hadoop.hdfs.tools.DelegationTokenFetcher "" --renewer null /tmp/spark.token
  3. 通过添加此配置来执行实际的 Spark 提交。 --conf spark.executorEnv.HADOOP_TOKEN_FILE_LOCATION=/tmp/spark.token \

以上是yarn执行器的认证方式。对 kubernetes 执行器也执行相同的操作。

关于docker - 在 Kubernetes 上运行 Spark 访问 kerberized Hadoop 集群时,如何解决执行器上的 "SIMPLE authentication is not enabled"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54181560/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com