spark streaming如何在kerberos认证的集群上提交任务

这篇具有很好参考价值的文章主要介绍了spark streaming如何在kerberos认证的集群上提交任务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

spark streaming 在kerberos认证后的集群上提交任务

背景

集群有kerberos认证,spark批处理任务提交后正常运行,spark streaming/structed streaming 任务提交后运行不了,报 java.io.IOException: org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS] 的错误,其中streaming任务里面有用到sparkSQL

处理方式

找到多种处理方式,在一一尝试之后,均不起作用。后突然灵光一闪,成功解决,现将所有方法罗列如下

前置条件

1、在提交spark-submit之前,确保要有SPARK_HOME,没有则需要export一下。
2、尽量打源码包,不要把依赖都打到包里,在提交的时候使用–jars提交集群上没有的依赖,避免开发环境和集群环境所用的同名依赖不同引起问题。

方法一:在提交命令里面增加参数

此方法网上有很多样例,此处直接列出增加的参数
–keytab /xxx/xxx/username.keytab --principal username@XXX.com
网上很多说法是把提交用户的principal 和keytab 增加到参数里面即可,其他都不用管,程序会自动进行认证,类似的还有 --conf spark.yarn.principal=username@XXX.com --conf spark.yarn.keytab=/xxx/xxx/username.keytab
此方法可以一试,我这里环境实测无效

方法二:在代码里面用UGI进行认证

代码如下
// 增加kerberos认证测试
logger.info(“=before Kerberos auth driver==”)
System.setProperty(“java.security.krb5.conf”, “krb5.conf”)
val principal = “username”
val keytabPath = “username.keytab”
val hadoopConf = new Configuration()
hadoopConf.set(“hadoop.security.authentication”, “Kerberos”)
UserGroupInformation.setConfiguration(hadoopConf)
UserGroupInformation.loginUserFromKeytab(principal, keytabPath)
logger.info(“=after Kerberos auth driver==”)
此方法本人环境测试无效。只能实现在driver中成功认证,executor中不能认证。

备注一:Unable to obtain password for user

此方法可能报 failure to login: for principle :uxername from username.keytab Unable to obtain password for user
由于 UserGroupInformation 只会从本地地址中获取keytab信息,所以不能填写hdfs目录,建议用相对路径,或者直接填keytab的文件名即可,然后再提交命令里面用–file 参数将 krb5.conf 和keytab文件传上去。

小贴士:在参数里面用了–keytab /xxx/xxx/username.keytab --principal username@XXX.com 之后,在用–file无法提交keytab 文件

此时只要将keytab文件改个名字即可,例如将 username.keytab 改为username_1.keytab就行。因为使用–keytab /xxx/xxx/username.keytab 之后,spark-submit 会将keytab 也上传至spark的运行路径下,导致再上传keytab 文件就报同名文件的错误,且用 --keytab 参数后,提交至spark运行路径下的keytab文件会被改名为username.keytab-{$md5},导致直接程序中获取不到username.keytab文件,所以这里改个名字就行。

备注二:在做了HA的CDH集群上使用此方法时,需注意如下要点

spark的checkpoint或者所写的hdfs路径,要使用逻辑URI,不能使用实际节点名
即得用类似hdfs://nameservice1/ 的连接,而不能使用类似hdfs://cdh01:8020/ 的连接原因如下:
在使用UGI进行登录注册认证时,如果它找到一个namenode uri 而不是逻辑uri,那么它将创建非HA文件系统,该文件系统将尝试使用简单UGI而不是kerberos UGI
源码:
private static Configuration getHdfsConfiguration() throws IOException {
Configuration configuration = new Configuration();

configuration.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName());
configuration.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());

File hadoopCoreConfig = new File(CONF_CORE_SITE);
File hadoopHdfsConfig = new File(CONF_HDFS_SITE);

if (! hadoopCoreConfig.exists() || ! hadoopHdfsConfig.exists()) {
    throw new FileNotFoundException("Files core-site.xml or hdfs-site.xml are not found. Check /etc/hadoop/conf/ path.");
}

configuration.addResource(new Path(hadoopCoreConfig.toURI()));
configuration.addResource(new Path(hadoopHdfsConfig.toURI()));

//Use existing security context created by $ kinit
UserGroupInformation.setConfiguration(configuration);
UserGroupInformation.loginUserFromSubject(null);
return configuration;

}

方法三:在代码里面增加hadoop的环境变量

此方法测试有效
在寻找解决方案时,突然发现,在streaming的applicationMaster中,environment中的spark properties里面只有spark的参数,缺少hadoop的参数,很奇怪,因此尝试增加hadoop参数,没想到就解决问题了。
代码如下
val builder = SparkSession.builder()
val hadoopConf = new Configuration()
// 这里的文件地址可以换成从数据库里查询
val core = new Path(“/etc/hadoop/conf/core-site.xml”)
val hdfs = new Path(“/etc/hadoop/conf/hdfs-site.xml”)
val hive = new Path(“/etc/hadoop/conf/hive-site.xml”)
val yarn = new Path(“/etc/hadoop/conf/yarn-site.xml”)

hadoopConf.addResource(core)
hadoopConf.addResource(hdfs)
hadoopConf.addResource(hive)
hadoopConf.addResource(yarn)

for (c <- hadoopConf.iterator().asScala) {
builder.config(c.getKey, c.getValue)
}

val conf = new SparkConf()
.setAppName(applicationAppName)

builder
.config(conf)
.getOrCreate()

在用创建SparkSession的过程中,保留第二步UserGroupInformation认证的步骤,增加获取core、hdfs、hive、yarn的参数,重新提交即可,且提交命令中不需要增加–keytab /xxx/xxx/username.keytab --principal username@XXX.com命令。
方法三在本人环境总亲测成功,但是正常情况下,提交spark任务至yarn中运行,会自动将集群参数给带上去,我这里没带上去的原因未知,还在排查中。望有知道原因的大佬不吝赐教。文章来源地址https://www.toymoban.com/news/detail-829828.html

到了这里,关于spark streaming如何在kerberos认证的集群上提交任务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spark---Master启动及Submit任务提交

    Spark集群启动之后,首先调用$SPARK_HOME/sbin/start-all.sh,start-all.sh脚本中调用了“start-master.sh”脚本和“start-slaves.sh”脚本,在start-master.sh脚本中可以看到启动Master角色的主类:“org.apache.spark.deploy.master.Master”。在对应的start-slaves.sh脚本中又调用了start-slave.sh脚本,在star-slave.

    2024年01月20日
    浏览(47)
  • Spark系列之SparkSubmit提交任务到YARN

    title: Spark系列 本地模式,不启动spark集群也能运行。 实际可运行命令: 运行截图: 结果截图: 需要启动Spark的StandAlone集群来运行。 直接提交可能会报错: spark-env.sh中: spark-defaults.conf中: 如若不生效,则直接拷贝 yarn-site.xml 文件到 $SPARK_HOME 中 上述任务在启动的时候,有

    2024年02月03日
    浏览(42)
  • Spark 提交任务参数设置关于(线程,shuffle,序列化)

    是在使用 Apache Spark 时,为了设置 Java 虚拟机(JVM)的堆栈大小而使用命令行选项。 -Xss 是 Java 虚拟机的一个选项,用于设置线程的堆栈大小。在这个命令行选项中, -Xss6m 表示将线程的堆栈大小设为 6MB。这个选项的作用是为了避免在运行 Spark 任务时出现堆栈溢出的错误。

    2024年02月02日
    浏览(571)
  • 服务器集群配置LDAP统一认证高可用集群(配置tsl安全链接)-centos9stream-openldap2.6.2

    因之前集群为centos6,已经很久没升级了,所以这次配置统一用户认证也是伴随系统升级到centos9时一起做的配套升级。新版的openldap配置大致与老版本比较相似,但有些地方配置还是有变化,另外,铺天盖地的帮助文档有相当一部分是直接搬砖过来的,所以参考时容易出错,这

    2024年02月05日
    浏览(43)
  • 大数据之Kerberos认证与kafka开启Kerberos配置

    数据安全 = 认证 + 授权 授权是指用户可以访问的资源,比如:授权用户张三不能访问ods层的表,可以访问dwd层和dws层的表。 再比如java中基于角色的身份认证RBAC(Role-Based Access Control)基于角色的权限控制。通过角色关联用户,角色关联权限的方式间接赋予。比如大数据中使

    2024年02月02日
    浏览(39)
  • 大数据之Kerberos认证

    1、Kerberos 是什么? Kerberos 是一个网络身份验证协议,用于在计算机网络中进行身份验证和授权。它提供了一种安全的方式,允许用户在不安全的网络上进行身份验证,并获取访问网络资源的权限。 2、Kerberos 的基本原理: Kerberos 使用密钥分发中心(Key Distribution Center,KDC)来

    2024年02月14日
    浏览(45)
  • Flink支持kerberos认证

    在配置flink任务时,不能通过对单个任务进行kerberos验证,只能在flink-conf文件中进行认证,这样遇到的麻烦就是,每次启动不同任务的时候,都需要进行依赖不同的conf文件 通过在flink github项目中查看,发现有pr提交了代码,可以在flink任务启动之初进行,conf文件加载 通过修改

    2024年02月16日
    浏览(39)
  • Kerberos安全认证-连载10-Hive Kerberos 安全配置及访问

    目录 1.Hive 配置 Kerberos 2. Hive Cli使用Kerberos ​​​​​​​3. Hive beeline使用Kerberos ​​​​​​​​​​​​​​4. JDBC访问Kerberos认证Hive ​​​​​​​5. Spark访问Kerberos认证Hive ​​​​​​​​​​​​​​6. Flink访问Kerberos认证Hive 技术连载系列,前面内容请参考前面

    2024年02月13日
    浏览(48)
  • Kerberos安全认证-连载11-HBase Kerberos安全配置及访问

    目录 1. Zookeeper Kerberos配置 2. HBase配置Kerberos 3. HBase启动及访问验证 4. HBase Shell操作HBase ​​​​​​​5. Java API操作HBase 技术连载系列,前面内容请参考前面连载10内容:​​​​​​​​​​​​​​Kerberos安全认证-连载10-Hive Kerberos 安全配置及访问_IT贫道的博客-CSDN博客

    2024年02月07日
    浏览(53)
  • Kerberos安全认证-连载12-Kafka Kerberos安全配置及访问

    目录 1. Kafka配置Kerberos 2. 客户端操作Kafka ​​​​​​​3. Java API操作Kafka 4. StructuredStreaming操作Kafka 5. Flink 操作Kafka 技术连载系列,前面内容请参考前面连载11内容:​​​​​​​​​​​​​​Kerberos安全认证-连载11-HBase Kerberos安全配置及访问_IT贫道的博客-CSDN博客 Kafk

    2024年02月12日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包