在 Kubernetes 上运行 Spark 来访问 Kerberized Hadoop 集群时,如何解决执行器上的“SIMPLE authentication is notenabled”错误?

2023-12-06

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

org.apache.hadoop.security.AccessControlException:简单 未启用身份验证。可用:[令牌、KERBEROS]

由于 Hadoop 环境是 Kerberized,因此我提供了有效的密钥表,以及 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 的成功连接。我相信执行者没有使用密钥表,如果他们运行 JAR,他们就会这样做。相反,他们正在运行驱动程序分配给他们的任务。

我可以从日志中看到驱动程序设法使用用户的密钥表正确地验证自身,USER123:

信息 SecurityManager:54 - SecurityManager: 身份验证已禁用; ui acl 已禁用;具有查看权限的用户:Set(spark, USER123); 具有查看权限的组:Set();具有修改权限的用户: 设置(火花,USER123);具有修改权限的组:Set()

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

信息 SecurityManager:54 - SecurityManager: 身份验证已禁用; ui acl 已禁用;具有查看权限的用户:Set(spark);团体 具有查看权限:Set();具有修改权限的用户: 设置(火花);具有修改权限的组: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 ^

但这没有什么区别。

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


首先使用以下命令从 hadoop 获取委托令牌。

  1. 使用您的密钥表和主体执行 kinit -kt
  2. 执行以下命令将 hdfs 委托令牌存储在 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 执行器也执行相同的操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Kubernetes 上运行 Spark 来访问 Kerberized Hadoop 集群时,如何解决执行器上的“SIMPLE authentication is notenabled”错误? 的相关文章

随机推荐

  • Cordova 插件 - 添加第三方 sdk

    我正在尝试为以下 sdk 创建插件 https ktplayhelp zendesk com hc en us articles 221071888 Android 在设置项目配置点中 它告诉我们通过在 Android studio 中导入
  • 如何在使用 SQL Server 插入/更新之前验证数据?

    我有一个这样定义的表 CREATE TABLE dbo ObjectRelationClauses Id INT NOT NULL PRIMARY KEY IDENTITY RelationId INT NOT NULL OperatorT
  • 在 REST 应用程序中为当前登录用户设计 URI

    我的 REST API 中需要一个 URI 来检索当前登录的用户 通常我使用GET具有 ID 的资源 但客户端不知道用户的 ID 我找到了以下解决方案 按用户名 此解决方案使用用户名而不是用户的 ID Example Bitbucket R
  • Visual Studio 2010 SP1 中缺少 MVC3

    我安装了VS 2010 Ultimate 它没有 MVC3 我安装了 SP1 它应该也安装了更新以及 MVC3 对吗 但安装后 我在新项目窗口中仍然没有 MVC3 选项 这是怎么回事 MVC3 是可选下载 http www asp net
  • LinkedIn 网站分享始终显示 1 分钟阅读

    我正在尝试找出如何删除1 min read在我向 LinkedIn 分享内容时的描述中 1 分钟阅读示例 我在页面上有打开的图表标签 并验证它们不会在页面上的任何位置显示 1 分钟阅读时间 我也玩过 og type 尝试 文章 媒体 视频
  • ASP.NET Web API 身份验证

    我希望在使用时从客户端应用程序对用户进行身份验证ASP NET Web API 我观看了网站上的所有视频并阅读了这个论坛帖子 把 Authorize 属性正确返回一个401 Unauthorized地位 但是 我需要知道如何允许用户登录 A
  • 具有多态性的Python棉花糖树结构

    我有以下树结构代码 class Node def init self node id str self node id node id self children def add child self node Node if isinst
  • 编译具有动态模块支持的 Apache Web 服务器

    我刚刚在全新安装的 Ubuntu 10 04 2 上编译了 Apache 2 2 17 这是一个学习练习 旨在发现编译某些内容时实际发生的情况 而不仅仅是使用 apt get 因此避免使用 apt get 而有利于自己编译该内容 I ran
  • 最佳学生座位安排的算法

    假设我需要将 n 30 名学生分为 2 到 6 人一组 然后我从每个学生那里收集以下偏好数据 学生姓名 Tom 喜欢和以下人坐在一起 吉米 埃里克 不喜欢和以下人坐在一起 约翰 保罗 林戈 乔治 这意味着他们对整个班级中他们没有提到的任何其
  • 针对用户提供的 url 属性的 ESAPI XSS 预防

    我的 REST API 之一需要一个属性 url 该属性需要一个 URL 作为用户的输入 我正在使用 ESAPI 来防止 XSS 攻击 问题是用户提供的 URL 类似于 http example com alpha abc def phil
  • 如何在 Play 2.4.0 上使用 Anorm 启用跟踪/调试输出

    在 Play 2 4 0 中 Anorm 已移至外部包 日志记录已更改为 LogBack http logback qos ch 一切都很好 但没有任何地方可以明显地跟踪 SQL 调用的类 包名称 显而易见 基于导入声明
  • 将枚举元素作为事件参数传递 C#

    是否可以将枚举元素作为事件参数传递 假设我有 public class Letters public delegate void StateChangedEventHandler object sender EventArgs e publ
  • Spark 2.x 上的 Cloudera Hive?

    看看这个 https www cloudera com documentation spark2 latest topics spark2 known issues html hive on spark 总而言之 它表示 Hive 不适用于
  • 使用 iTextSharp 从 pdf 中提取图像及其名称

    我正在使用 iTextSharp c 从目录 pdf 中提取图像及其名称 我能够从 pdf 中提取图像 但很难根据所附的屏幕截图提取其相应的图像名称并使用该名称保存文件 请找到下面的代码并让我知道您的建议 样本 PDF https docd
  • 旋转矩形并以正弦波方式移动它 - 使用graphics2D帮助

    Hi 我使用之前的 Stackoverflow 帖子编写了下面的代码 我只想将矩形旋转一定角度并使其以正弦波移动 该代码也旋转整个正弦波 我明白为什么会这样 但我不知道如何实现我的意图 请帮忙 非常感谢您抽出时间 import java a
  • 使用不同过滤器的实体框架 6 查询

    我有个问题 当我运行下面的代码时 var data context TableX Where w gt w userId 9999 w id 9999 Distinct ToList 这是生成的查询 SELECT Extent1 id AS
  • Android 自然传感器方向帮助

    我正在尝试实现 Reto Meier 推荐的保持屏幕方向不变的方法 他在 Google IO 期间演讲的幻灯片 参见 23 可以在以下位置找到 Android 专业提示 在哪里下载幻灯片和代码片段 我已单步执行代码并设置值 但屏幕方向仍然发
  • JSlider——需要建议

    我在Java中使用JSlider时遇到问题我画了一个圆A 我想在第一个圆A内放置另一个圆B 我想将第二个圆B的中心放置在与第一个圆B的中心相同的坐标处圆A 然后我想使用JSlider来增加或减少圆B的半径 问题是 当您增加或减少滑块时 圆B
  • 我如何设置此序列形式的序列(Inno Setup)

    我正在寻找一个串行脚本 我在这里找到了一个 Inno Setup 中序列号的自定义页面 但是我该如何设置序列号 因为现在所有序列号都有效 感谢您的回答 扩展我的代码previous post 如果你想将序列号与常量值进行比较 可以这样修改脚
  • 在 Kubernetes 上运行 Spark 来访问 Kerberized Hadoop 集群时,如何解决执行器上的“SIMPLE authentication is notenabled”错误?

    我正在尝试在 Kubernetes 上运行 Spark 目的是处理来自 Kerberized Hadoop 集群的数据 我的应用程序由简单的 SparkSQL 转换组成 虽然我能够在单个驱动程序 Pod 上成功运行该进程 但在尝试使用任何执