我有一个spark作业,每10分钟运行一次,需要5分钟才能完成。假设在任何外部条件下,这个作业需要15分钟,那么下一个作业就会被跳过。是否有任何机制可以找到哪个小时的作业被跳过。举个例子。工作开始于9点30分,需要15分钟才能完成,然后9点40分的工作将被跳过,9点50分的工作将开始等等。如何找到我们错过了9点40分的工作。
col17t5w1#
我将首先尝试更改作业的调度方式,以便提交作业的工具首先检查正在运行的作业,然后记录由于已经运行的作业而跳过提交。不过,还有其他一些选择。选项1-历史服务器这是最简单和最直接的选择。spark history服务器提供了一个ui,它提供了所有应用程序(运行)的开始时间,如果还没有运行,则提供了它们完成或失败的时间。请参阅spark的监控文档。关于设置历史记录服务器,有一个简短的摘要:https://luminousmen.com/post/spark-history-server-and-monitoring-jobs-performance选项2-查询时间线服务器(Yarn)请看https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/timelineserver.html选项3-解析日志如其中一条评论所述,您可以搜索日志。如果您已经集成了logstash之类的工具,那么这是最简单的。如果没有启用这样的工具,您可以尝试一种更简单的方法,使用集群上调度程序的日志记录。启用日志聚合(如果尚未启用)。如何做到这一点取决于您是否使用Yarn,Mesos,或其他一些选择运行Spark。例如,如果您使用的是yarn,并且它配置为日志聚合,那么您可以使用查看所有提交的应用程序id及其状态 yarn application -list -appStates ALL 并使用收集应用程序的日志 yarn logs <application_id> . 然后,可以使用日志中的时间戳和其他信息(假设log4j.properties等配置文件是正确的)。选项4-记录驱动程序中经过的时间如果以上不是一个选项(历史服务器没有设置,您没有访问权限,作业没有在同一个集群上运行,或者其他原因),您可以记录 val start = System.currentTimeMillis 在程序开始时,使用 val elapsedMin = (System.currentTimeMillis - start) / 60000 . 然后您可以记录经过的分钟数,和/或发送消息(如果需要) elapsedMin >= 15 . 您可能需要说明应用程序没有按时启动。但是,这种方法的可靠性较低,因为它不能解释运行时间较长的作业失败的原因。我不会单独使用这种方法。
yarn application -list -appStates ALL
yarn logs <application_id>
val start = System.currentTimeMillis
val elapsedMin = (System.currentTimeMillis - start) / 60000
elapsedMin >= 15
1条答案
按热度按时间col17t5w1#
我将首先尝试更改作业的调度方式,以便提交作业的工具首先检查正在运行的作业,然后记录由于已经运行的作业而跳过提交。不过,还有其他一些选择。
选项1-历史服务器
这是最简单和最直接的选择。spark history服务器提供了一个ui,它提供了所有应用程序(运行)的开始时间,如果还没有运行,则提供了它们完成或失败的时间。请参阅spark的监控文档。
关于设置历史记录服务器,有一个简短的摘要:https://luminousmen.com/post/spark-history-server-and-monitoring-jobs-performance
选项2-查询时间线服务器(Yarn)
请看https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/timelineserver.html
选项3-解析日志
如其中一条评论所述,您可以搜索日志。如果您已经集成了logstash之类的工具,那么这是最简单的。
如果没有启用这样的工具,您可以尝试一种更简单的方法,使用集群上调度程序的日志记录。启用日志聚合(如果尚未启用)。如何做到这一点取决于您是否使用Yarn,Mesos,或其他一些选择运行Spark。例如,如果您使用的是yarn,并且它配置为日志聚合,那么您可以使用查看所有提交的应用程序id及其状态
yarn application -list -appStates ALL
并使用收集应用程序的日志yarn logs <application_id>
. 然后,可以使用日志中的时间戳和其他信息(假设log4j.properties等配置文件是正确的)。选项4-记录驱动程序中经过的时间
如果以上不是一个选项(历史服务器没有设置,您没有访问权限,作业没有在同一个集群上运行,或者其他原因),您可以记录
val start = System.currentTimeMillis
在程序开始时,使用val elapsedMin = (System.currentTimeMillis - start) / 60000
. 然后您可以记录经过的分钟数,和/或发送消息(如果需要)elapsedMin >= 15
. 您可能需要说明应用程序没有按时启动。但是,这种方法的可靠性较低,因为它不能解释运行时间较长的作业失败的原因。我不会单独使用这种方法。