项目中由于任务量较大(实时任务10w+)所以使用LTS进行任务分布式调度,其中TaskTracker和jobClient部署在一起,项目正常运行两年多。
项目一般在凌晨对任务进行统一处理,其中包含实时任务和cron任务,在近期凌晨出现一个定时为02:05的取外围接口数据的cron任务出现漏数现象,经过对LTS日志查看发现当天任务未派发也未发现错误(摸不到头脑了,关键之后该任务又正常执行了)。后来发现该任务的创建时间为当日02:06,判断出该任务可能被obClient重新提交任务了。随即检查应用节点发现节点的创建时间也是02:06,所以可以确定节点在凌晨出现重启了。
后续对该问题进行了还原操作:
1、cron任务在2019-04-10 18:30:00 进行创建并通过jobClient提交至JobTracker
2、在2019-04-10 01:30:00 LTS开始对实时任务进行派发,由于实时任务量较大导致各个节点的资源使用率过高(LTS中当TaskTracker资源使用率比较高时JobTracker将不再对该该节点派发任务),在02:05时由于没有资源被释放所以任务一致处于等待队列中,等待有可用资源后该任务将会被派发至TaskTracker执行。
3、在02:05时其中一个节点出现故障并重启后,对应的cron任务也就被重新提交了,任务在提交给JobTracker后,JobTracker会推算该任务的下次执行时间。由于任务已经过了当日执行时间点了 所以推算出来的下次执行时间则为2019-04-11 02:05:00。从而也就导致了当日任务未执行。
对于此类问题暂时不知道如何进行规避,还请大神不吝赐教。