海豚DolphinScheduler系统调度操作分析
一个工作流实例可以包含很多任务实例,各个任务实例有的有依赖顺序关系。
BASEDIR=$(cd `dirname $0`; pwd)
cd $BASEDIR
nowtime=`date +"%F %T"`
echo $nowtime >> $BASEDIR/shell.log
Shell01.sh
Shell02.sh
Shell03.sh
Shell04.sh
Shella.sh
Shellb.sh
一、【工作流执行正常的情况】
运行结果:
二、【假设shella.sh脚本错误,执行失败】
运行:
运行结果:
修改脚本为正确,重跑:
从结果可以分析,重跑,就说明是工作流重跑:
三、【将其中一个节点执行时间延长1000秒,并且在期间重启服务】
将shell03.sh 时间执行延长,模拟该实例执行时间较长:
BASEDIR=$(cd `dirname $0`; pwd)
cd $BASEDIR
nowtime=`date +"%F %T"`
for i in `seq 1 1000`
do
sleep 1
echo "$nowtime shell03 .....$i....." >> $BASEDIR/shell.log
done
echo "$nowtime shell03" >> $BASEDIR/shell.log
运行结果:
假设这个时候服务停止会如何呢?
发现分配的实例还是在执行:
经分析确实是没有系统调度的java进程:
启动服务:
sh script/start-all.sh
运行结果:
出现这个结果的原因是:停止服务,但是根本没有停止当时分配给shell03.sh的执行任务。
最后执行完毕:
注意恢复容错跟重跑是不一样的。恢复容错是从任务实例错误的开始执行,工作流重跑是头开始跑。
四、【中途停止】
恢复运行:
将shell03.sh执行时间延长1000秒,假设在这期间中途停止呢?会不会跟重启服务一样呢?
执行到shell03.sh的时候,停止
停止:
发现该任务实例的脚本shell03.sh也是出于停止状态,没有继续执行:
恢复
这也就是说明停止,他会杀死shell03.sh的任务实例,恢复运行,会对任务实例shell03.sh重新初始化执行。这个在运行过程中,停止系统调度服务是一样的,停止系统调度的服务他不会杀死shell。启动服务后,系统会容错恢复,也就是对当时刚好运行到某个任务实例,从那个任务实例开始重新初始化继续执行。
总结:在需要停机对系统调度进行维护的时候,最好是选择工作流任务少的时候,并且对其停止“中止服务”,然后停止系统调度服务,然后关机。终止工作流任务跟直接停止海豚系统任务(sh stop-all.sh)的主要区别的停止服务他未必能杀死工作流中的任务实例任务,虽然服务停止了,任务实例还有可能在执行。终止工作流任务它就会杀死相应的任务实例,其实这也很容易理解,任务实例其实可理解为被封装的一个任务进程,终止它当然是杀敌该进程,恢复——当然就是对这个任务实例重新初始化执行。