我有一个长期运行的Spark流的工作,读Kafka。此作业只启动一次,预计将永远运行。
簇被煤化。
我所观察到的是,这项工作运行了几天(超过7天)。在作业开始时,我们可以看到它获得了有效期为7天的hdfs委托令牌。
2017年6月18日12:32:11信息hdfs.dfsclient:为用户创建了令牌:hdfs\u delegation\u tokenowner=user@domain,Renewar=yarn,realuser=,issuedate=1529213531903,maxdate=1529818331903,sequencenumber=915336,masterkeyid=385(在ha上)-hdfs:cluster
作业持续运行超过7天,但在此期间(maxdate之后的几天)之后,它会随机突然将状态更改为“已接受”。在此之后,它尝试获取新的kerberos票证,但未能给出kerberos的错误-
18/06/26 01:17:40 info.client:应用程序的应用程序报告\u x \u 80353(状态:正在运行)
18/06/26 01:17:41 info.client:应用程序的应用程序报告\u x \u 80353(状态:正在运行)
18/06/26 01:17:42 info.client:申请报告申请号:x\u80353(状态:已接受)
18/06/26 01:17:42信息.客户:
客户端令牌:令牌{种类:yarn\u客户端令牌,服务:}
最后的例外-
18/06/26 01:17:45警告security.usergroupinformation:priviledgedactionexceptionas:user@domain (auth:kerberos) cause:javax.security.sasl.saslexception:gss initiate失败[由gssexception引起:未提供有效凭据(机制级别:找不到任何kerberos tgt)]
注意-我已经尝试传递keytab文件,这样就可以永远完成委派。但我无法将keytab文件传递给spark,因为它与kafka jaas.conf冲突。
所以有三个相关的问题-
为什么作业可以将状态从“正在运行”更改为“已接受”?
问题是否发生在我无法通过keytab时?如果是,在kerberos上使用kafka和spark流时如何传递keytab-keytab在传递keytab时不能工作--文件。keytab已经在jaas.conf中配置,并在spark submit中随--files param一起分发。有没有其他方法可以获得新的工作票?
当作业再次尝试进入运行状态时,yarn拒绝它,因为它没有有效的krb票证。如果我们确保驱动程序节点总是有有效的krb票证,会有帮助吗?因此,当这种情况发生时,就像提交新的Spark工作;因为该节点具有有效的krb票证,它不会给出kerberos错误。
2条答案
按热度按时间j91ykkif1#
为什么作业可以将状态从“正在运行”更改为“已接受”?
如果应用程序失败,并且您仍有可用的am重试次数,则作业将从“运行”转换为“接受”。
问题是否发生在我无法通过keytab时?如果是,在kerberos上使用kafka和spark流时如何传递keytab-keytab在传递keytab时不能工作--文件。keytab已经在jaas.conf中配置,并在spark submit中随--files param一起分发。有没有其他方法可以获得新的工作票?
对。spark允许长时间运行的应用程序,但在安全的系统上,您必须传入keytab。
引用为长时间运行的应用程序配置spark on yarn,并强调:
长时间运行的应用程序(如spark流作业)必须能够写入hdfs,这意味着hdfs用户可能需要在默认生存期之外委托令牌。此工作负载类型需要使用--principal和--keytab参数将kerberos principal和keytab传递给spark submit脚本。keytab被复制到运行applicationmaster的主机上,kerberos登录被定期更新,方法是使用主体和keytab生成hdfs所需的委托令牌。
基于kafka-1696,这个问题还没有解决,所以我不知道你能做什么,除非你运行cdh,可以升级到spark2.1。
参考文献:
状态转换是什么意思?
hadoop委托令牌解释-(参见标题为“长时间运行的应用程序”的部分)
kafka-1696-kafka应该能够生成hadoop委托令牌
Yarn应用程序安全-“保护长寿命Yarn服务”部分
从apachekafka到apachespark安全地读取数据
tvmytwxo2#
在这里更新的解决方案,解决了我的问题,为他人的利益。解决方案是简单地提供--principal和--keytab作为另一个复制文件,这样就不会有冲突。
为什么作业可以将状态从“正在运行”更改为“已接受”?
由于kerberos票证无效,应用程序更改了状态。这可以在租约到期后的任何时间发生,但不会在租约到期后的任何确定时间发生。
问题是否发生在我无法通过keytab时?
这确实是因为keytab。有一个简单的解决办法。考虑这一点的简单方法是,只要需要hdfs访问,就需要传递keytab和principal(如果您有流式处理作业)。只需复制您的keytab文件并将其传递给:--keytab“my copy yarn.keytab”--principaluser@domain“所有其他的考虑因素仍然与jaas文件等相同,所以您仍然需要应用这些因素。所以这并不妨碍这一点。
当作业再次尝试进入运行状态时,yarn拒绝它,因为它没有有效的krb票证。如果我们确保驱动程序节点总是有有效的krb票证,会有帮助吗?
这基本上是因为Yarn是试图更新内部票。在启动新尝试时,从中启动应用程序的节点是否具有有效票证并不重要。Yarn必须有足够的信息,以更新机票和申请启动时,它需要有有效的机票(第二部分将始终是真实的,因为没有这个工作甚至不会开始,但你需要照顾第一部分)