我有很长时间运行的火花流作业,可以从kafka读取。该作业一次启动,并且有望永久运行。
集群被kerberized。
我观察到的是,几天(超过7天)的工作运行正常。在工作开始时,我们可以看到它获取了有效期为7天的HDFS委托令牌。
18/06/17 12:32:11信息hdfs.DFSClient:为用户创建的令牌:HDFS_DELEGATION_TOKEN owner = user @ domain,newer = yarn,realUser =,issueDate = 1529213531903,maxDate = 1529818331903,sequenceNumber = 915336,masterKeyId = 385 on ha-hdfs:cluster
作业持续运行超过7天,但是在那段时间之后(maxDate之后的几天),它突然随机更改为接受状态。在此之后,它尝试获取新的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的应用报告(状态:已接受)
18/06/26 01:17:42 INFO yarn.Client:
客户令牌:令牌{种类:YARN_CLIENT_TOKEN,服务:}
最终例外-
18/06/26 01:17:45警告security.UserGroupInformation:PriviledgedActionException as:user @ domain (auth:KERBEROS)原因:javax.security.sasl.SaslException:GSS启动 失败[由GSSException引起:未提供有效的凭据 (机制级别:找不到任何Kerberos tgt)]
注意-我已经尝试过传递keytab文件,以便可以永远进行委派。但是我无法传递keytab文件来触发它,因为它与kafka jaas.conf冲突。
所以有3个相关问题-
答案 0 :(得分:1)
- 为什么作业可以将状态从RUNNING更改为ACCEPTED?
如果应用程序失败并且您仍然可以进行AM重试,则作业将从“运行中”转换为“接受”。
- 该问题是否正在发生,因为我无法通过密钥表?如果是,在使用kafka并通过kerberos进行火花流传输时如何传递keytab? -keytab不起作用,因为我们通过--files传递了keytab。 keytab已在jaas.conf中配置,并在spark-submit中随--files param一起分发。工作还有其他方法可以获取新票吗?
是的。 Spark允许长时间运行的应用程序,但是在安全系统上,您必须传递密钥表。
用重点突出引用Configuring Spark on YARN for Long-Running Applications:
长时间运行的应用程序(例如Spark Streaming作业)必须能够写入HDFS,这意味着hdfs用户可能需要委派令牌(可能超出默认生存期)。此工作负载类型要求使用--principal和--keytab参数将Kerberos主体和密钥表传递给spark-submit脚本。密钥表将复制到运行ApplicationMaster的主机,并通过使用主体和密钥表来生成HDFS所需的委托令牌来定期更新Kerberos登录。
基于KAFKA-1696,此问题尚未解决,因此,我不确定除非运行CDH并可以升级到Spark 2.1,否则您不能做什么。
参考:
答案 1 :(得分:0)
在这里更新解决方案可以解决我的问题,从而为他人谋福利。解决方案是简单地提供--principal和--keytab作为另一个复制文件,以免发生冲突。
为什么作业可以将状态从“正在运行”更改为“接受”?
由于kerberos票证无效,应用程序更改了状态。这可以在租约到期后的任何时间发生,但在租约到期后的任何确定时间都不会发生。
由于我无法通过密钥表而导致问题发生了吗?
确实是因为有keytab。有一个简单的解决方案。考虑这一点的简单方法是,每当需要HDFS访问时,如果您有流作业,就需要传递keytab和principal。只需复制您的keytab文件并通过以下命令传递它即可:--keytab“ my-copy-yarn.keytab” –principal“ user @ domain”所有其他注意事项仍与jaas文件等相同,因此您仍然需要应用这些文件。因此,这不会对此造成干扰。
当作业再次尝试进入RUNNING状态时,YARN拒绝了该作业,因为它没有有效的KRB票证。如果我们确保驱动程序节点始终具有有效的KRB票证,会有所帮助吗?
这实际上是发生的,因为YARN试图在内部更新票证。启动新尝试时,从中启动应用程序的节点是否具有有效票证并不重要。 YARN必须具有足够的信息来续签票证,并且在启动应用程序时,它必须具有有效的票证(第二部分始终为真,因为没有这项工作甚至不会开始,但您需要注意第一部分)