银行卡作业调度与监控管理系统的改进方案.docx
银行卡统计分析系统调度系统的改进方案ChildList=ChildAdd(szChild_Node_Id, szChild_Job_id)7、从job_rel_status删除把不运行作业作为父亲的作业链(依赖关系)。Delete from job_rel_status where up_node_id=:szNode_Id and up_job_id=:szjob_ld8、用ChildList作为作业,用ParentList作为父作业,构成笛卡儿乘积插入 job rel status 中。While(IParentl=null) While (lChild!=null) Insert into job_rel_status(node_id, job_id, up_node_id, up_job_id, proc_status, up_proc_status)Values(:IChild->node_id, :lChild->job id, :lParent->node_id, :lParent->job i d)lChild=lChild->next;)lParent=lParent->next;)Free(IParent);Free (IChild);9、选择下一个不运行作业,转第5步,直到结束。2.5结束语我们所有处理流程都是以job_relation表作为基础的,因此job_relation表的作业 链必须正确。文档信息编写者编写日期审核者审核日期批准人批准日期变更历史日期变更描述批准文档资料分发姓名职位机构1 概述11.1 目的11.2 预期的读者和阅读建议11.3 文档约定11. 4参考文献12改进方案22. 1背景23. 2目标24. 3术语25. 4改造思路31.1.1 1 模型表结构的调整31.1.2 计算运行逻辑51.1.3 处理逻辑51.1.4 伪代码实现描述52.5结束语71概述目的1.1 预期的读者和阅读建议文档约定1. 4参考文献2改进方案2.1背景目前的调度系统虽然功能强大,但是在处理模式上只有两种模式包括每天运行或不运行 等,很难适应现代企业的数据处理。2. 2目标一、现代调度系统除了每天不运行或运行作业外,还能处理年初末、月初末、周末、旬、半年初末作业等,系统可以自定义。二、不影响白天客户访问,ETL分时段运行3术语1每天处理(every day running,以下简称RRR):表示此作业每天运行;2、指定月的某日处理(special day running,以下简称nnR, nn是数字):表示此作业 在2-27(大月包含28、29、30,小月包含28、29,闰月包含28)日中的指定日运行;3、周六处理(Saturday running,以下简称W6R):表示此作业在每周六运行;4、周日处理(Sunday running,以下简称W7R):表示此作业在每周日运行;5、周末处理(Saturday& Sunday running,以下简称WER):表示此作业在每周六、 日运行;6上旬初处理(early start-month running,以下简称EMS):表示此作业在每上旬 的第一天运行;7、上旬末处理(early end-month running,以下简称EME):表示此作业在每上旬的 最末一天运行;8、中旬初处理(middle start-month running,以下简称MMS):表示此作业在每中 旬的第一天运行;9、中旬末处理(middle end-month running,以下简称MME):表示此作业在每中旬 的最末一天运行;10、下旬初处理(last start-month running,以下简称LMS):表示此作业在每下旬 的第一天运行;11、下旬末处理(last end-month running,以下简称LME):表示此作业在每下旬的 最末一天运行;12、旬初处理(ten-days start-month running,以下简称TMS):表示此作业在每旬 的第一天运行;13、旬末处理(ten-days end-month running,以下简称TME):表示此作业在每旬的 最末一天运行;14、月初处理(start-month running,以下简称MSR):表示此作业在每月的第一天运 行;15、月末处理(end-month running,以下简称MER):表示此作业在每月的最末一天运 行;16、上半年末处理(early half end-year running,以下简称EHE):表示此作业在 06月30日运行;17、下半年初处理(last half start-year running,以卜简称LHS):表示此作业在 07月1日运行;18、年初处理(start-year running,以下简称YSR):表示此作业在01月01日运行;19、年末处理(end-year running,以下简称年末:表示此作业在12月31日运行;20、季末处理(end-quarter running,以下简称QER):表示此作业在3月31日、6 月30日、9月30日、12月31日运行;2.4改造思路2. 4.1模型表结构的调整2. 4. 1.1解决某天运行的问题在原有的调度系统模型中job表增加一个字段proc mode char (100) not null, -处理模式此字段包含了 RRR、nnR、W6R、W7R、WER、EMS、EME、MMS、MME、LMS、LME、TMS、 TME、MSR、MER、EHE、LHS、YSR、YER、QER 的任意组合,譬如:1、procjnode="24R, YER" :表示在每月的24日运行,或者在年末运行;2、proc_mode= "RRR” :表示在每天运行;3、proc_mode= "YSR, MER” :表示在01月01日运行,或者在每月末运行;2. 4. 1.2解决某时段运行的问题在原有的调度系统模型中,node_info表增加一个字段run phrase char (100) not null,运行时段内容可表述为:0000-0900; 1640-2359描述在0点中到早上9点,或下午16点40分到23点59分这个时段对应此节点是 可以允许运行的。每段用;分隔,区间用一分隔。在ReleaseQue函数中增加一段程序控制:if (nSucFlg =1) /*成功*/(/*EXEC SQL SELECT parall_num , used_parall_numINTO :nParallNum, :nUsedParallNumFROM node infoWHERE node_id=:szNodeld;*/EXEC SQL SELECT parall num , used parall num, run phraseINTO :nParallNum, :nUsedParallNum, :szRunPhraseFROM node infoWHERE node_id=:szNodeld;if ( nUsedParallNum >= nParallNum )(PrintLogX(4, pszLogFileName, z,%s szNodeId%-s已用 的 并发数%_d 已>=节点总并发数%-d,放弃,ReleaseQue,szNodeld, nUsedParallNum , nParallNum);break;/*进入到下一个节点的轮训*/if ( PermStart(szRunPhrase, pszLogFileName) !=0)(PrintLogX(4, pszLogFileName, z,%-s 此时段,szNodeld%-s不适合运行,选 择放弃,ReleaseQue,szNodeld);break;/*进入到下一个节点的轮训*/2. 4.1. 3在周六、周日24时时段全部允许运行问题在原有的调度系统模型中,node_info表增加一个字段week_run_mode char (1) not null ,周末24小时允许运行模式内容可表述为:1-启用24小时运行模式,其余不允许处理逻辑:优先判定week_run_mode的运行模式,如果是周末,采用24小时运行模 式,那么不需判定。如果不是周末或者不是24小时运行模式,那么判定run_prhase。2. 4. 1.4是否起用运行模式问题在原有的调度系统模型中,node_info表增加一个字段run_mode_flg char (1) not null ,是否起用运行模式内容可表述为:1-起用运行模式,其余不允许处理逻辑:优先判定run_mode_flg的起用,如果为'1'那么再优先判定week_run_mode 的运行模式,如果是周末,采用24小时运行模式,那么不需判定。如果不是周末或者不是 24小时运行模式,那么判定run_prhase;否那么其他模式无效2. 4.2计算运行逻辑在下列图中,如果B1标识为B1(O)或者! Bl (1,MER)分别表示不运行或者不在每月 末不运行。而实际运行图那么去掉A1B1, B1C1, B1C2边,增加A1C1,A1C2边的联接。原来A1 作业运行完后,那么运行B1作业,等B1作业运行完后,再运行C1作业,并把C2作业 置成可运行状态;C2等待B2作业运行完后,再运行。实际运行图那么原来A1作业运行 完后,那么运行运行C1作业,并把C2作业置成可运行状态;C2等待B2作业运行完后, 再运行。实际运行图如下列图示:2. 4.3处理逻辑1、保存B1的父作业A1;2、保存B1的作业C1,C23、利用A1与Cl、C2的的笛卡积关系,生成A1C1,A1C2的联接依赖边;2. 4.4伪代码实现描述1、从job的每一个作业查找运行标志为'1'的作业,抽取两个标志run_flag 和 proc_mode.DECLARE SQLTAG select node id,job id, run_flag, proc mode from job where run flag=,1'(声明游标)FETCH SQLTAG into :szNode_Id, :szjob_id, :szRun_Flag, szProc_Mode (获取 每个作业)2、计算调度日期exejdate,生成符合19个处理模式(除RRR, nnR标志外)内 符合条件的标志current proc mode;在proc mode中查找'RRR'或'nnR'或 current_proc mode.nExec_Flag=Chk_Proc_Mode(szExec_Date, szProc_Mode)如果nExec Flag=l,那么在调度为exec date这个日期,此作业运行,否那么不 运行;3、如果存在,那么把jobjelation表中的关系链放入到job_rel_status中。从 job选取下一条,转第一步,直到结束。如果nExec_Flag=L然后Insertintojob_rel_status(node_id, job_id, up_node_id, up_job_id, proc_status,up_proc_status)select node_id, job_id, up_node_id, up_job_id, ' N' , ' N' from job relationwhere node_id=:szNode_Id and job_id=:szjob_ld4、准备重建依赖关系。从job的每一个作业查找运行标志为'O'(不运行) 的作业,抽取1个标志run_flag.主要目的,查找不运行作业,以便剔除从第3步获 得不运行的父亲作业。DECLARE SQLTAG1 select node_id, job_id, run_flag from job where run_flag=" O'(声明游标)FETCH SQLTAG into : szNode ld, :szjob id, :szRun_Flag (获取每个作业)5、以不运行作业为基,在job_relation表中保存此作业的父亲作业。放入父 亲队列ParentList中;DECLARE SQLTAG2 select up nodeid,up Job id from job relationwhere node_id=: szNode_Id and job_id=:szjob_ld (声明游标)FETCH SQLTAG2 into : szUp_Node_Id, :szUp_Job_id (获取每个作业)ParentList=ParentAdd(szUp_Node_Id, szUp_Job_Id)6、以不运行作业为基,在job_relation表中保存此作业的孩子作业。放入孩子 队列 ChildList 中;DECLARE SQLTAG3 select up node_id,up job id from job relationwhere up_node_id=: szNode_Id and up_job_id二:szjob_ld(声明游标)FETCH SQLTAG3 into : szChild_Node_Id, : szChild_Job_id (获取每个作业)