事故是上月底的事了,刚才有人又提起这事,还是记录下为好。
7月28号因为暂停DW上的任务,将Azkaban的Jetty服务暂时停了,下午下班前启动不起来,于是同事跑来找我帮忙看。起初怀疑他又动了不该动的配置导致,查看文件时间都是若干月前的;当时没找到什么原因,从启动日志中看有如下错误,主要原因是“java.lang.IllegalStateException: 100000 increments of period did not get to present time.”这句,但是有些不明所以。
14/07/28 19:57:36 INFO impl.StdSchedulerFactory: Quartz scheduler 'QuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties' 14/07/28 19:57:36 INFO impl.StdSchedulerFactory: Quartz scheduler version: 2.1.6 14/07/28 19:57:36 INFO core.QuartzScheduler: Scheduler QuartzScheduler_$_NON_CLUSTERED started. 2014-07-28 19:57:36.763:WARN:oejw.WebAppContext:Failed startup of context o.e.j.w.WebAppContext{/azkaban,file:/data/srv/azkaban/azkaban_web/app/temp/webapp/},/data/app/azkaban/a java.lang.IllegalStateException: 100000 increments of period did not get to present time. at azkaban.scheduler.ScheduledJob.getNextRuntime(ScheduledJob.java:100) at azkaban.scheduler.ScheduledJob.updateTime(ScheduledJob.java:77) at azkaban.scheduler.LocalFileScheduleLoader.createScheduledJob(LocalFileScheduleLoader.java:179) at azkaban.scheduler.LocalFileScheduleLoader.loadFromFile(LocalFileScheduleLoader.java:144) at azkaban.scheduler.LocalFileScheduleLoader.loadSchedule(LocalFileScheduleLoader.java:74) at azkaban.scheduler.CronScheduleManager.<init>(CronScheduleManager.java:64) at azkaban.app.AzkabanApplication.<init>(AzkabanApplication.java:221) at azkaban.web.AzkabanServletContextListener.contextInitialized(AzkabanServletContextListener.java:63) at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:771) at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:411) at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:763) at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:247) at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1238) at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:706) at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:480) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:39) at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:186) at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:494) at org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:141) at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:145) at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:56) at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:609) at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:540) at org.eclipse.jetty.util.Scanner.scan(Scanner.java:403) at org.eclipse.jetty.util.Scanner.doStart(Scanner.java:337) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) at org.eclipse.jetty.deploy.providers.ScanningAppProvider.doStart(ScanningAppProvider.java:121) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) at org.eclipse.jetty.deploy.DeploymentManager.startAppProvider(DeploymentManager.java:555) at org.eclipse.jetty.deploy.DeploymentManager.doStart(DeploymentManager.java:230) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) at org.eclipse.jetty.util.component.AggregateLifeCycle.doStart(AggregateLifeCycle.java:81) at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:58) at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:96) at org.eclipse.jetty.server.Server.doStart(Server.java:277) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) at org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1265) at java.security.AccessController.doPrivileged(Native Method) at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1188) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.eclipse.jetty.start.Main.invokeMain(Main.java:468) at org.eclipse.jetty.start.Main.start(Main.java:616) at org.eclipse.jetty.start.Main.main(Main.java:92)
通过google那个异常,可以在网上找到如下一段代码:
DateTime now = new DateTime(); DateTime date = new DateTime(scheduledDate); int count = 0; while (!now.isBefore(date)) { if (count > 100000) { throw new IllegalStateException("100000 increments of period did not get to present time."); } if (period == null) { break; } else { date = date.plus(period); } count += 1; }
但当时也没能太理解究竟是干嘛用,于是放弃。接着反复尝试过几次其他方式后,无果。只能采用逐渐去除配置的方式来检验出错原因:
将日志中打印的这两个jobs、cron的配置挪到其他文件夹下,来测试问题出在哪
14/07/28 19:57:36 INFO app.AzkabanApplication: schedule.file param not set. Defaulting to /data/srv/azkaban/azkaban_jobs/jobs/jobs.schedule 14/07/28 19:57:36 INFO app.AzkabanApplication: schedule.backup.file param not set. Defaulting to /data/srv/azkaban/azkaban_jobs/jobs/jobs.schedule.backup 14/07/28 19:57:36 INFO app.AzkabanApplication: cron.schedule.file param not set. Defaulting to /data/srv/azkaban/azkaban_jobs/jobs/cron_jobs.schedule 14/07/28 19:57:36 INFO app.AzkabanApplication: cron.schedule.backup.file param not set. Defaulting to /data/srv/azkaban/azkaban_jobs/jobs/cron_jobs.schedule.backup
黄天不负有心人,很快试出是jobs.schedule的问题,移除之后就能正常启动,贴回来就又会报错。当时已下班,第二天还需要定时任务执行,于是用粗暴的方式建议同事再重新配置遍,陪他苦逼了十几分钟参照原来jobs.schedule中的任务重新配置了遍。
回家路上还在想这事,为什么报个10万出来?结合网上那段代码,后来意识到,是不是从起始时间算起,每一间隔执行时间段计数一次,大于10万后就抛出异常,防止死循环。结合6月底重启过一次,很正常,以及刚才陪同事配置时job.schedule中的起始时间大约都是2013-12-31;于是掏出手机,打开计算器开始算,因为我记着有每隔5分钟一次的任务,所以,一小时就是12次,于是有
12 X 24(小时) X 30(天) X 6(月) = 51840
12 X 24(小时) X 30(天) X 7(月) = 60480
很遗憾,结果没能对上。回家后VPN到公司服务器,又看了遍jobs.schedule,发现有3分钟一次的任务
{ "id": "dw2_c2.t_oper_rete_online", "ignoreDependency": false, "recurrence": "3m", "time": "2013-12-30.14.55.00.000", "timezone": "Asia/Shanghai" },
于是又有
20(次) X 24(小时) X 30(天) X 6(月) = 86400
20(次) X 24(小时) X 30(天) X 7(月) = 100800
\(^o^)/~ 猜想正确! 再返回来读下代码就彻底明白了
DateTime now = new DateTime(); //获取当前时间 DateTime date = new DateTime(scheduledDate); //获取任务开始时间 int count = 0; //定义计数器 while (!now.isBefore(date)) { //如果当前时间在任务开始时间之后,则进入循环体 if (count > 100000) { //计数器大于10万后就抛异常:经过10万次计算出的下一次执行时间未达到当前时间(说的太内涵了,对母语非e文的解读起来有点困难,有木有!) throw new IllegalStateException("100000 increments of period did not get to present time."); } if (period == null) { //如果周期为空,直接退出 break; } else { //将任务开始时间增加一个周期 date = date.plus(period); } count += 1; }
这下彻底明了了,当时就不需要重新配,只需要把time改为接近当前的一个时间点就可以了。
经过这件事,遇到棘手问题,一是要多想想,想不到的,可以采用减少配置的方式来逐渐缩小问题范围,一旦问题找到了,离原因就不远了。办法总比问题多的嘛
相关推荐
azkaban3.2版 azkaban.native.lib异常解决方法 azkaban3.2版 azkaban.native.lib异常解决方法
1、基于SSM架构,基于springboot实现,可用接口调用 2、azkaban的复杂的依赖配置可以变成简单的...3、接口直接执行azkaban,无需人工登录azkaban触发执行 4、核心代码可以直接复用,用于对azkaban有定制需求的开发者
Azkaban是一款开源的工作流执行器,主要用于大数据处理工作流的调度和管理。它由LinkedIn开发并维护,设计目标是简化Hadoop作业的管理和执行。Azkaban4.0是其一个重要的版本,包含了对先前版本的改进和新功能的添加...
一般来说,Azkaban可以通过命令行启动,比如执行一个名为`bin/azkaban`或者`startup.sh`的脚本来启动服务器。 在Azkaban的压缩包中,文件名“azkaban”可能是一个文件夹,包含了Azkaban的所有组件,如配置文件、可...
4. **启动服务**:启动Azkaban执行服务器和Web服务器,通常使用`bin/start-azkaban.sh`和`bin/start-webserver.sh`脚本。 5. **测试与使用**:通过Web界面提交工作流定义(通常为`.job`文件),设置工作流的依赖...
Azkaban是一款开源的工作流和批处理作业调度系统,由LinkedIn开发并维护。它主要用于管理大数据处理流程,如Hadoop作业。Azkaban3.2版本提供了更稳定、高效和易用的调度服务,适用于复杂的数据处理工作流。 在部署...
#### 一、Azkaban简介 Azkaban是一款开源的工作流调度系统,它主要用于批量数据处理任务的管理与调度。Azkaban提供了简单易用的界面来创建、管理和监控工作流,并支持依赖关系的任务调度。 #### 二、Azkaban源码...
Azkaban 是一个开源的定时任务系统,用于管理和执行定时任务。下面将详细介绍 Azkaban 的配置和运行过程。 一、创建 Azkaban 用户 在 Linux 系统中,需要创建一个名为 azkaban 的用户,并赋予 sudo 权限。使用以下...
2. **任务调度算法**:Azkaban如何决定何时启动下一个任务,以及如何处理并发和资源限制。 3. **任务执行流程**:从接收到执行请求到任务完成,涉及哪些步骤,如何处理异常和失败。 4. **扩展机制**:如何编写和集成...
Azkaban 2.5.0 是一个专为数据处理任务设计的工作流执行和调度系统。这个开源项目旨在简化批量作业的管理和执行流程,尤其在大数据处理领域中,它能够帮助用户有效地组织和自动化一系列相互依赖的任务。Azkaban 的...
5. **调度与依赖**:Azkaban的工作流可以设置定时触发,也可以根据前一作业的完成状态来决定是否启动。3.13可能在调度逻辑上有所优化,例如更灵活的依赖条件或更精确的定时器。 6. **日志与监控**:Azkaban提供了...
Azkaban Web Server是Azkaban的核心组件之一,它提供了用户友好的Web界面,用于提交、监控和管理工作流任务。在本文中,我们将深入探讨Azkaban Web Server的功能、架构以及如何在`azkaban-web-server-2.5.0.tar`这个...
Azkaban是一款强大的工作流调度工具,主要用于大数据处理和ETL(Extract, Transform, Load)任务的调度。在IT行业中,高效的任务调度是确保数据处理流程稳定运行的关键,而Azkaban因其简单易用和强大的功能,被广泛...
Azkaban是一款开源的工作流管理系统,专为大数据处理工作流程设计。它允许用户定义和调度复杂的依赖关系,以便在Hadoop和其他分布式计算环境中执行任务。Azkaban的主要目标是简化批处理作业的管理,提高效率,并确保...
Azkaban 是一个流行的大数据工作流调度系统,尤其在Hadoop和MapReduce作业的管理中广泛应用。它为用户提供了直观的Web界面来定义、组织和执行一系列相关任务,确保大数据处理流程的顺序和依赖关系得到正确处理。在...
Azkaban是一款开源的工作流执行器,主要用于大数据处理工作流的调度和管理。在这个场景中,我们关注的是Azkaban的2.5.0版本,它包含三个主要组件:Executor Server、Web Server和SQL Script。 1. **Executor Server...
5. 启动服务:使用启动脚本启动Azkaban Web服务器和Executor服务器。例如,`bin/start-azkaban.sh web`和`bin/start-azkaban.sh executor`。 三、使用Azkaban 1. 登录Web界面:在浏览器中输入Azkaban Web服务器的...
5. **启动Azkaban**:根据你的需求选择启动Azkaban的Server和Web Server。Azkaban Server负责执行任务,而Web Server提供用户界面和API接口。 6. **上传项目和工作流**:使用Azkaban的Web界面或者命令行工具上传你...
Azkaban是一款开源的工作流执行引擎,主要用于大数据处理工作流的调度和管理。它由LinkedIn开发,设计目标是简化批处理任务的管理和执行。Azkaban的核心特性包括工作流依赖管理、定时调度、任务监控以及丰富的用户...