【问题标题】:Spark streaming job changing status to ACCEPTED from RUNNING after few days几天后,Spark 流作业将状态从 RUNNING 更改为 ACCEPTED
【发布时间】:2018-12-05 02:15:50
【问题描述】:

我长期运行从 kafka 读取的 spark 流式传输作业。此作业只启动一次,预计将永远运行。

集群是kerberized。

我观察到的是,工作几天(超过 7 天)运行良好。在作业开始时,我们可以看到它获得了有效期为 7 天的 HDFS 委托令牌。

18/06/17 12:32:11 INFO hdfs.DFSClient:为用户创建令牌:HDFS_DELEGATION_TOKEN owner=user@domain,renewer=yarn,realUser=,issueDate=1529213531903,maxDate=1529818331903,sequenceNumber=915336,masterKeyId =385 on ha-hdfs:cluster

作业持续运行超过 7 天,但在那段时间之后(maxDate 后几天),它随机突然将状态更改为 ACCEPTED。此后,它尝试获取新的 kerberos 票证,但未能为 kerberos 提供错误 -

18/06/26 01:17:40 INFO yarn.Client:application_xxxx_80353 的应用报告(状态:RUNNING)
18/06/26 01:17:41 INFO yarn.Client:application_xxxx_80353 的应用报告(状态:RUNNING)
18/06/26 01:17:42 INFO yarn.Client:application_xxxx_80353 的应用报告(状态:ACCEPTED)
18/06/26 01:17:42 INFO yarn.Client:
客户端令牌:令牌{种类:YARN_CLIENT_TOKEN,服务:}

最终例外 -

18/06/26 01:17:45 WARN security.UserGroupInformation: PriviledgedActionException as:user@domain (auth:KERBEROS) 原因:javax.security.sasl.SaslException:GSS 启动 失败 [由 GSSException 引起:未提供有效凭据 (机制级别:找不到任何 Kerberos tgt)]

注意 - 我已经尝试过传递 keytab 文件,以便可以永远完成委托。但我无法将 keytab 文件传递​​给 spark,因为它与 kafka jaas.conf 冲突。

所以有3个相关问题-

  • 为什么作业可以将状态从 RUNNING 更改为 ACCEPTED?
  • 是因为我无法通过 keytab 而出现问题吗?如果是,如何在使用 kafka 和 spark-streaming over kerberos 时传递 keytab? -keytab 不起作用,因为我们使用 --files 传递 keytab。 keytab 已在 jaas.conf 中配置,并与 spark-submit 中的 --files 参数一起分发。有什么其他方式可以让工作获得新票吗?
  • 当作业再次尝试进入 RUNNING 状态时,YARN 拒绝它,因为它没有有效的 KRB 票证。如果我们确保驱动节点始终拥有有效的 KRB 票证会有所帮助吗?所以当这种情况发生时,就像提交新的火花作业一样;因为该节点具有有效的 KRB 票证,并且不会给出 kerberos 错误。

【问题讨论】:

  • 您运行的是什么版本的 Spark、Hadoop 和 Kafka?你看stackoverflow.com/questions/47977075/…了吗?
  • 我们正在使用 spark 2.1 并且能够连接到 kafka,问题仅在于长时间运行的作业。版本信息 - Spark 2.1.0.cloudera1、Hadoop 2.6.0-cdh5.8.4、KAFKA-2.1.1

标签: apache-spark apache-kafka spark-streaming hadoop-yarn kerberos


【解决方案1】:

在此处更新解决我的问题的解决方案,以造福他人。解决方案是简单地提供 --principal 和 --keytab 作为另一个复制文件,这样就不会发生冲突。

为什么作业可以将状态从 RUNNING 更改为 ACCEPTED?

由于 kerberos 票证无效,应用程序更改了状态。这可以在租约到期后的任何时间发生,但不会在租约到期后的任何确定时间发生。

问题是因为我无法通过 keytab 吗?

确实是因为keytab。有一个简单的解决方案。考虑这一点的简单方法是,每当需要访问 HDFS 时,如果您有流式作业,则需要传递 keytab 和主体。只需复制您的 keytab 文件并将其传递给: --keytab "my-copy-yarn.keytab" --principal "user@domain" 所有其他注意事项仍然与 jaas 文件等相同,因此您仍然需要应用这些.所以这不会干扰。

当作业再次尝试进入 RUNNING 状态时,YARN 拒绝它,因为它没有有效的 KRB 票证。如果我们确保驱动节点始终拥有有效的 KRB 票证会有所帮助吗?

这基本上是因为 YARN 试图在内部更新票证。在启动新尝试时,启动应用程序的节点是否具有有效票证并不重要。 YARN 必须有足够的信息来更新票证,并且当应用程序启动时,它需要有有效的票证(第二部分总是正确的,因为没有这个工作甚至不会开始,但你需要照顾第一部分)

【讨论】:

    【解决方案2】:
    • 为什么作业可以将状态从 RUNNING 更改为 ACCEPTED?

    如果应用程序失败并且您仍有可用的 AM 重试次数,则作业将从 RUNNING 转换为 ACCEPTED。

    • 是因为我无法通过 keytab 而出现问题吗?如果是,如何在使用 kafka 和 spark-streaming over kerberos 时传递 keytab? -keytab 不起作用,因为我们使用 --files 传递 keytab。 keytab 已在 jaas.conf 中配置,并与 spark-submit 中的 --files 参数一起分发。有什么其他方式可以让工作获得新票吗?

    是的。 Spark 允许长时间运行应用程序,但在安全系统上,您必须传入密钥表。

    引用 Configuring Spark on YARN for Long-Running Applications 并强调:

    Spark Streaming 作业等长时间运行的应用程序必须能够写入 HDFS,这意味着 hdfs 用户可能需要委托令牌,可能超出默认生命周期。此工作负载类型需要使用 --principal 和 --keytab 参数将 Kerberos 主体和 keytab 传递到 spark-submit 脚本。 keytab 被复制到运行 ApplicationMaster 的主机上,并通过使用 principal 和 keytab 定期更新 Kerberos 登录,以生成 HDFS 所需的委托令牌。

    基于 KAFKA-1696,此问题尚未解决,因此我不确定您可以做什么,除非您正在运行 CDH 并且可以升级到 Spark 2.1。

    参考资料:

    【讨论】:

    • 我们已经浏览过cloudera的文章。问题是我们不能通过 --keytab 和 --principal 以及 --files 和 keytab,因为它会给同一个文件带来冲突。我们通过 --files 选项传递 keytab,并且主体进入 jaas.conf 文件。 jaas.conf 里面有 keytab 位置。这是正确的 kafka 连接所必需的。似乎代码也能够在 7 天后更新 KRB 票,所以除了这个问题之外,这一切似乎都可以正常工作。
    • 是的,你的处境很混乱。我想知道你的 keytab 中是否可以有 2 个主体,包括 spark 和 kafka 来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多