Azkaban为任务调度执行框架,在使用的时候 如果是有程序相互依赖的情况下,运行 java -ja 包名.jar 时候,千万不要添加后台运行命令 java -jar 包名.jar &
如果在使用后台运行,Azkaban 不会按照依赖流程来,会将依赖中的所有的 所有的Jar 的sell脚本直接按照顺序运行完毕,会进行并行,如果你业务需求是,串行,必然会出现问题!!!
Azkaban 任务调度是状态监控实际是监控当前Jar,端口进程
java -jar /mnt/test/test.jar 当前程序运行完毕,程序会退出,进程号 会被杀掉
如果是 java -jar /mnt/test/test.jar & 程序会后台运行,并且持续检测不到端口号,Azkaban 会直接给Azkaban的web页面返回运行完毕success
如果你写的是 Flow 工作流的模式,有依赖模式depend on A--->,在每一个Shell后面添加了& ,那么Azkaban 不会等待 依赖进程按序执行完毕,而是按照循序依次执行完毕Shell脚本,并且退出程序,并且让程序并行! 你所写的依赖都会失败
①:比如 程序之间有相互依赖,但是程序 A 负责 数据拉去,程序B负责数据ETL,程序C负责数据标签计算工作,如果程序 A 今日数据拉取并未进行数据更新,程序 B 必然无法基于拉取数据进行ETL操作,程序 C 也无法针对新的数据进行标签计算,所以此处需要进行控制,有两种方案!
在Azkaban的运行WebUi页面获取下图
第一种:使用System.exit(1); 程序非正常退出,如果在 程序JobA 中是使用system.exit(1);会出现JobA 程序变为鲜红【表示程序异常】,后续JobB 和JobC会显示为浅红色,如下图所示:
颜色代表状态:鲜红色为: 【运行异常】
淺红色为: 【未运行,Cancelled(取消断开的)】
查看运行详细可知
JobA运行【失败】——>JobB运行【取消】——>JobC运行【取消】
使用当前这种方法会使Azkaban 整个工作流程会显示为异常状态,很容易被人怀疑程序的健壮性,出现异常的问题!,如果设置了异常邮邮件提醒,如果每天没有拉取到数据,每天都会收到异常邮件,如果遇到真的异常你会很难发现!!!
【实际问题为:数据拉去并没有数据,并非程序异常问题,没有数据需要执行的操作就是退出所有程序,并且Azkaban运行流程为成功状态】
为解决上述需求,经过多次测试,如果按照需求,
设置,如果拉取数据为空,直接退出当前程序,但是,如果你使用的是Azkaban的依赖工作流程的话,JobA 退出了程序【return/system.exit(0)】,但是只会退出当前程序,并不会退出工作流,反而继续工作流的后续程序调用!
为解决工作流调度问题,使用第三方MySql使用判断标记的方法!
如果在数据拉去的时候,数据为空的时候,将MySql表中存一个标
Flag == 1 状态为正常
Flag == 0 状态为失败
if(Flag == 0){
return;//或者system.exit(0); //正常退出,状态为Succeess,页面状态为绿色,
throw new RunntimeException("手动抛出异常")/system.exit(1);//非正常退出,状态为Fail,页面状态为红色
}else{
//继续调用后续业务代码
}
由此可知,在如果有工作流的情况下,并且需要在页面状态为Succeess,并且正常退出,不发送数据为拉去到的手动异常邮件,或者非正常退出的邮件!
可以选择数据库建表 添加状态!!!
在每一个工作以来需要运行的时候 ,第一步 都会调用判断状态的方法,如果状态为1继续执行,如果状态为0停止当前调用,后续同样如此! 即可
Job A如图
Job B如图
Job C如图
有上图可知,可以解决此次工作流的依赖 等問題...........................