热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【spark】记录一次sparksparkstreaming使用命令行提交任务在Yarn集群模式无法正常消费kerberoskafka数据的问题

前言最近在提交spark程序到yarn消费kerberos认证方式的kafka数据。由于配置文件相对绝对路径不正确配置遇到了报错,这里整理并记录一下。环境信息s

前言

最近在提交 spark 程序到 yarn 消费 kerberos 认证方式的 kafka 数据。由于配置文件 相对/绝对路径不正确配置 遇到了报错,这里整理并记录一下。

环境信息


  • spark 2.4
  • hadoop 3.0
  • kafka 2.4

问题原因:

先提前说下问题的最终原因:由于 spark-submit 提交任务命令 kafka_client_jaas.conf配置文件 相对/绝对路径 不合理导致的。那么我原来的提交命令是什么

问题复现:

我们来重新复现下这个问题。之前用的错误的spark-submit 命令如下

spark-submit 命令行

spark-submit --class com.cebbank.rwms.SparkTest \
--principal "rwms@CDPCEBBANK.COM" \
--keytab "/user/rwms/rwms.keytab" \
--files "/etc/krb5.conf,/user/rwms/kafka_client_jaas.conf" \
--conf "spark.driver.extraJavaOptions=-Djava.security.auth.login.config=kafka_client_jaas.conf" \
--conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=kafka_client_jaas.conf" \
--conf "spark.driver.memoryOverhead=1024" \
--conf "spark.executor.memoryOverhead=1024" \
--master yarn \
--deploy-mode cluster \
--name SparkTestDemo \
--driver-cores 1 \
--driver-memory 1G \
--executor-cores 1 \
--executor-memory 1G \
--queue rwms \
--num-executors 1 \
rwms-etl.jar

这里我用到如下几个配置文件:

  1. /etc/krb.conf
  2. kafka_client_jaas.conf
  3. rwms.keytab

并且这几个配置文件需要在 driver 节点和 executor 节点上都需要有。

kafka_client_jaas.conf

KafkaClient {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truekeyTab="/user/rwms/rwms.keytab"storeKey=trueuseTicketCache=falseserviceName="kafka"principal="rwms@CDPCEBBANK.COM";
};

报错内容

ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
org.apache.kafka.common.KafkaException: javax.security.auth.login.LoginException: Could not login: the client is being asked for a password, but the Kafka client code does not currently support obtaining a password from the user. not available to garner authentication information from the userat org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:160)at org.apache.kafka.common.network.ChannelBuilders.create(ChannelBuilders.java:146)at org.apache.kafka.common.network.ChannelBuilders.serverChannelBuilder(ChannelBuilders.java:85)at kafka.network.Processor.<init>(SocketServer.scala:726)at kafka.network.SocketServer.newProcessor(SocketServer.scala:367)at kafka.network.SocketServer.$anonfun$addDataPlaneProcessors$1(SocketServer.scala:261)at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:158)at kafka.network.SocketServer.addDataPlaneProcessors(SocketServer.scala:260)at kafka.network.SocketServer.$anonfun$createDataPlaneAcceptorsAndProcessors$1(SocketServer.scala:223)at kafka.network.SocketServer.$anonfun$createDataPlaneAcceptorsAndProcessors$1$adapted(SocketServer.scala:220)at scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:62)at scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:55)at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:49)at kafka.network.SocketServer.createDataPlaneAcceptorsAndProcessors(SocketServer.scala:220)at kafka.network.SocketServer.startup(SocketServer.scala:120)at kafka.server.KafkaServer.startup(KafkaServer.scala:255)at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:38)at kafka.Kafka$.main(Kafka.scala:84)at kafka.Kafka.main(Kafka.scala)

使用 spark-local 模式

我们使用 spark on yarn-cluster 任务无法执行&#xff0c;于是我们将任务改为 spark local[*] 模式&#xff0c;发现就没问题。

问题解决

经过问题定位终于发现是 kafka_client_jaas.confkeyTab&#61;"/user/rwms/rwms.keytab" 这一行的绝对路径导致的。

因为: keytab文件配置文件是使用 YARN 资源分发。这些配置文件最终将位于 执行Spark YARN 容器的目录中&#xff0c;因此改行的内容应指定为相对路径 也就是 ./rwms.keytab

另外如下的几个配置也需要改成相对路径

--conf "spark.driver.extraJavaOptions&#61;-Djava.security.auth.login.config&#61;./kafka_client_jaas.conf"
--conf "spark.executor.extraJavaOptions&#61;-Djava.security.auth.login.config&#61;./kafka_client_jaas.conf"

spark.driver.extraJavaOptionsspark.executor.extraJavaOptions 都需要改成相对路径。


正确的kafka_client_jaas.conf

KafkaClient {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab&#61;truekeyTab&#61;"./rwms.keytab"storeKey&#61;trueuseTicketCache&#61;falseserviceName&#61;"kafka"principal&#61;"rwms&#64;CDPCEBBANK.COM";
};

这里我们以为问题已经解决了&#xff0c;结果还是不行&#xff0c;后面经过查询我们还需要将keytab 文件也传递给 Yarn 服务。

最终的spark-submit命令

spark-submit \
--class com.cebbank.rwms.SparkTest \
--principal "rwms&#64;CDPCEBBANK.COM" \
--keytab "/user/rwms/k-rwms.keytab" \
--files "/etc/krb5.conf,/user/rwms/kafka_client_jaas.conf,/user/rwms/rwms.keytab" \
--conf "spark.driver.extraJavaOptions&#61;-Djava.security.auth.login.config&#61;./kafka_client_jaas.conf -Djava.security.krb5.conf&#61;/etc/krb5.conf" \
--conf "spark.executor.extraJavaOptions&#61;-Djava.security.auth.login.config&#61;./kafka_client_jaas.conf -Djava.security.krb5.conf&#61;/etc/krb5.conf" \
--conf "spark.driver.memoryOverhead&#61;1024" \
--conf "spark.executor.memoryOverhead&#61;1024" \
--master yarn \
--deploy-mode cluster \
--name SparkTestDemo \
--driver-cores 1 \
--driver-memory 1G \
--executor-cores 1 \
--executor-memory 1G \
--num-executors 1 \
--queue rwms \
rwms-etl.jar

为了方便阅读&#xff0c;这里我将不同的地方贴出

旧的命令行

--keytab "/user/rwms/k-rwms.keytab"
--files "/etc/krb5.conf,/user/rwms/kafka_client_jaas.conf"

新的命令行

--keytab "/user/rwms/k-rwms.keytab"
--files "/etc/krb5.conf,/user/rwms/kafka_client_jaas.conf,/user/rwms/rwms.keytab"

注意&#xff1a;新的命令行 keytab “/user/rwms/k-rwms.keytab” 这个地方特别注意下&#xff0c;文件名字是不同的&#xff0c;但是文件内容是一致的&#xff0c;为什么要这么改&#xff0c;是因为当同时配置 --keytab “/user/rwms/rwms.keytab” 和 – files “/user/rwms/rwms.keytab” 会造成程序的异常退出。为了避免冲突&#xff0c;我们引入一个不同名但同根的keytab 文件即&#xff1a;k-rwms.keytab 和 rwms.keytab 但其实这俩文件没什么区别。

举个例子&#xff1a;
当spark提交任务时&#xff0c;yarn会将--keytab后面的keytab文件--files里的文件先后上传&#xff0c;即 hdfs.keytabrwms.keytab均会被上传&#xff0c;sparkkafka各取所需&#xff0c;即可正常工作。

当spark与kafka要使用相同的keytab文件时&#xff0c;比如都用rwms.keytab&#xff0c;那么yarn会先后上传两次rwms.keytab&#xff0c;在spark正使用的时候更新了keytab&#xff0c;造成异常退出。

下面列一下几种模式的不同&#xff1a;

spark locol 模式
在本地模式下&#xff0c;配置文件的相对/绝对路径&#xff0c;对程序没什么影响。

spark-yarn-client 模式
client 模式下&#xff0c;因为driver 端时在本地&#xff0c;本地的配置文件都有&#xff0c;所以spark.driver.extraJavaOptions 中的配置文件路径 相对/绝对 影响不大&#xff0c;spark.executor.extraJavaOptions 需要写成相对路径。

spark-yarn-cluster 模式
cluster模式下&#xff0c;driver 和 executor 节点都不在本地&#xff0c;所以配置文件都不存在&#xff0c;所以spark.driver.extraJavaOptions 需要写成相对路径&#xff0c;
spark.executor.extraJavaOptions 需要写成相对路径。

总结

以上的问题&#xff0c;说白了就是在任务真正的执行节点&#xff0c;并没有成功从 绝对路径 中加载到对应的配置文件。

我们在生产中将 jaas 配置文件和 keytab 作为本地资源文件传递。将 jaas 配置文件选项添加到为驱动程序和执行程序指定的 JVM 选项中

因为别的节点并没有这些配置文件。所以需要用 --flies 将我们需要用到的配置都加载到yarn 服务上&#xff0c;然后 yarn 来将这些配置问价分发到真正执行任务的目录上。

我们生产上使用的一些参数中指定的配置也最好写成相对路径。如&#xff1a;spark.driver.extraJavaOptionsspark.executor.extraJavaOptions

参考


  • https://docs.cloudera.com/HDPDocuments/HDP2/HDP-2.4.3/bk_spark-guide/content/spark-streaming-kafka-kerb.html
  • https://blog.csdn.net/u012373717/article/details/115401706

推荐阅读
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • Linux的uucico命令使用方法及工作模式介绍
    本文介绍了Linux的uucico命令的使用方法和工作模式,包括主动模式和附属模式。uucico是用来处理uucp或uux送到队列的文件传输工具,具有操作简单快捷、实用性强的特点。文章还介绍了uucico命令的参数及其说明,包括-c或--quiet、-C或--ifwork、-D或--nodetach、-e或--loop、-f或--force、-i或--stdin、-I--config、-l或--prompt等。通过本文的学习,读者可以更好地掌握Linux的uucico命令的使用方法。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • 安装oracle软件1创建用户组、用户和目录bjdb节点下:[rootnode1]#groupadd-g200oinstall[rootnode1]#groupad ... [详细]
  • 微信商户扫码支付 java开发 [从零开发]
    这个教程可以用作了解扫码支付的整体运行过程,已经实现了前端扫码,记录订单,回调等一套完整的微信扫码支付。相关链接:微信支 ... [详细]
  • 我创建了一个新的AWSSSO(使用内部IDP作为身份源,因此不使用ActiveDirectory)。我能够登录AWSCLI、AWSGUI,但 ... [详细]
author-avatar
篱边_水祭
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有