SkyNet任务调度监控系统-使用手册
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SkyNet调度系统使用手册
修改记录
目录
第1章系统概述 (5)
1.1 背景 (5)
1.2 系统架构 (6)
1.2.1 名词解释 (6)
1.2.2 系统模块 (6)
1.2.3 系统特性 (7)
1.3 系统核心功能 (7)
第2章DashBoard (8)
2.1 页面 (8)
2.2 功能 (8)
第3章任务维护 (9)
3.1 添加任务 (9)
3.1.1 页面 (9)
3.1.2 功能 (10)
3.2 查询操作任务 (11)
3.2.1 页面 (11)
3.2.2 查询任务 (11)
3.2.3 运行任务 (12)
3.2.4 查看任务依赖 (13)
3.2.5 修改任务 (13)
3.2.6 删除任务 (14)
第4章任务依赖 (15)
4.1 查询依赖 (15)
4.2 添加任务依赖 (15)
4.3 删除任务依赖 (15)
4.4 查看任务最后一次运行详情 (16)
第5章任务监控 (17)
5.1 页面 (17)
5.2 查询任务运行历史 (17)
5.3 查看任务运行日志 (18)
5.4 重做任务 (18)
5.5 KILL任务 (19)
第6章告警配置 (20)
6.1 添加任务告警 (20)
6.1.1 任务失败告警 (21)
6.1.2 任务超时未完成告警(暂未实现) (21)
6.2 查询任务告警配置 (21)
6.3 修改任务告警 (22)
6.4 删除任务告警 (23)
6.5 查询告警发送记录 (23)
第7章系统部分运行原理 (23)
7.1 业务类型 (23)
7.2 程序路径 (24)
7.3 指定任务运行主机 (24)
7.4 调度的延迟 (24)
附录A 动态时间参数 (27)
附录B Quartz时间表达式 (28)
附录C 定时任务配置流程 (29)
附录D 依赖任务配置流程 (29)
第1章系统概述
1.1 背景
大数据平台技术框架支持的开发语言多种多样,开发人员的背景差异也很大,这就产生出很多不同类型的程序(任务)运行在大数据平台之上,如:MapReduce、Hive、Pig、Spark、Java、Shell、Python等。
这些任务需要不同的运行环境,并且除了定时运行,各种类型之间的任务存在依赖关系,一张简单的任务依赖图如下:
目前各业务的数据任务基本都是靠Crontab定时调度,各个任务之间的依赖仅靠简单的串行来实现。
这样做的问题:
●很容易造成前面的任务未结束或者失败,后面的任务也运行起来,最
终跑出错误的分析结果;
●任务不能并发执行,增加任务执行的整体时间窗口;
●任务管理和维护很不方便,不好统计任务的执行时间及运行日志;
●缺乏及时有效的告警;
SkyNet调度监控系统,正是为了解决以上问题。
1.2 系统架构
1.2.1 名词解释
1.2.2 系统模块
JobManager:SkyNet的Master,提供RPC服务,接收并处理JobClient/Web 提交的所有操作;与元数据通讯,维护Job元数据;负责任务的统一配
置维护、触发、调度、监控
●JobMonitor: 监控正在运行的Job状态、监控任务池、监控等待运行的Job;
●JobWorker:SkyNet的Slave,从任务池中获取Job、负责启动并收集Job
的执行状态,维护至元数据库;
●JobClient/Web:SkyNet客户端类,前端界面提供给用户,用作任务的配
置、管理、监控等;
●任务元数据:目前使用Mysql,保存Job的配置、依赖关系、运行历史、
资源配置、告警配置等;
1.2.3 系统特性
●分布式架构:容量和负载能力(JobWorker)可线性扩充;
●高可用性:拥有主备Master,一旦主Master异常,备Master会接替主
Master提供服务(后期实现);
●高容错性:Master重新启动后,会将之前未完成的任务重新调度运行;
●完善易用的Web用户界面:用于用户配置、提交、查询、监控任务及任
务的依赖关系;
●支持任意类型的任务:除了Hadoop生态圈的MapReduce、Hive、Pig等,
还支持其他任何语言开发的任务,如Java、Shell、Python、Perl、Spark等;
●完整的日志记录:收集并记录任务运行过程中产生的标准输出和标准错
误,提供Http访问,用户可通过访问任务对应的日志Url来方便的访问
任务运行日志;
●任务之间的灵活依赖:可将任意一个任务作为自己的父任务进行依赖触
发;
●灵活多样的告警规则:除了失败告警,也支持任务超时未完成、任务超
时未开始等告警规则;
1.3 系统核心功能
●任务的管理和维护:添加、修改、删除、运行、重做、Kill任务;
●任务依赖关系维护:添加、修改、删除任务之间的依赖关系;
●查询:
根据业务类型、任务ID查询任务;
根据任务ID查询任务的父、子任务;
根据任务状态、任务ID、任务实例ID、任务创建时间、业务日期查询任务运行情况;
根据任务ID查询任务告警配置信息;
根据任务ID、告警发送时间、告警发送状态查询告警发送记录;
查询任务的运行完整日志;
●任务告警:配置、修改、删除任务告警;
第2章DashBoard
2.1 页面
2.2 功能
SkyNet系统任务和资源情况的整体监控。
●任务
✓总共任务数:系统中所有的任务数量;点击进入“查询操作任务”页面。
✓正在运行:当天,正在运行的任务数量;点击进入“任务监控”页面。
✓成功:当天,运行成功的任务数量;点击进入“任务监控”页面。
✓失败:当天,运行失败的任务数量;点击进入“任务监控”页
面。
✓等待:当天,等待运行的任务数量;点击进入“任务监控”页面。
●资源
✓系统中所有的资源(JobWorker)主机名、可运行的任务类型、该任务类型最多可运行的任务数量、该任务类型正在运行的任务
数量;
第3章任务维护
3.1 添加任务
3.1.1 页面
点击”任务维护”→“添加任务”进入。
3.1.2 功能
向系统中添加任务。
●任务名称:填入该任务的名称,长度:200字节。
●任务类型:从下拉菜单中选择任务类型,JAVA、SHELL、MR等。
●任务业务日期格式:该任务要处理的数据日期格式,支持天和小时的日
期格式,如,${yyyy-MM-dd,-2d}表示两天前,${yyyy-MM-dd-HH,-1H}表
示一小时前。
(具体用法见附录A解释);
●程序路径:程序所在的绝对路径,支持本地路径和HDFS路径,
如:/home/liuxiaowen/jobs/shell-job.sh、
hdfs://namenode/tmp/lxw/jobs/java-job.jar
注意:
✓当程序存储在HDFS上时候,填入正确的HDFS路径,
以”hdfs://”开头,区分大小写;执行任务的用户(跟业务类型
有关)必须有访问权限。
✓当程序存储在本地目录时候,必须在JobWorker所在机器的本地目录,且执行任务的用户(跟业务类型有关)必须有访问权
限。
●程序运行类型:当任务类型为JAVA、MR时候,指定程序运行的类名,
如:com.lxw.test.TestJavaSuccessJob,其他任务类型留空即可。
●程序运行参数:程序运行需要的参数,多个参数以空格分开,系统会将
该值整体传给程序运行,这里可以加动态时间参数,程序在调度时候,
会以真实的业务日期,替换其中的动态时间参数。
比如:业务日期设置为${yyyy-MM-dd,-1d},今天(2015-05-04)调度时
候根据当前时间,得到的真实业务日期为2015-05-03,而程序运行参数
中有day=${yyyy-MM-dd,-1d},此处替换时候会以2015-05-03为基准时
间,替换后为day=2015-05-02
●程序定时运行时间:当程序需要定时运行时候,填入Quartz时间表达
式(具体用法见附录B解释);
●业务类型:根据实际业务,选择业务类型;
注意:
✓业务类型和程序执行所使用的用户有关,特别是和Hadoop
有关的任务,如:wizad业务使用wizad用户、ut业务使用
ut用户;
✓如果没有自己的业务类型或者想使用其他用户执行程序,
请与管理员联系;
●任务说明:对该任务的说明,可空;
●指定运行主机:一般不填。
如果需要指定程序到哪台机器上运行,请填入主机名,前提是指定
的主机上必须运行着JobWorker服务,具体使用请与管理员联系。
●失败重试次数:当任务失败时候,可以重试10次以下。
●失败重试间隔:任务失败重试时间间隔,单位为秒,最低60秒。
●失败执行命令:任务最终失败时,执行该命令,用于失败后处理,比
如:sh /tmp/jobfailed.sh ${yyyy-MM-dd}
这里可以用动态时间参数,替换规则同程序运行参数中的替换规则。
●父任务:在添加任务时候,可以直接指定依赖的父任务,ID以逗号分
隔。
点击”添加任务”按钮之后,弹出框会显示操作结果。
●如果结果中是刚添加的任务信息,首个数字为任务ID,如下图所示:
则表示添加成功,点击”Close”按钮之后,会跳转至任务查询页面,显示刚才添加的任务。
●如果弹出框中显示null或其他信息,则表示添加失败。
3.2 查询操作任务
3.2.1 页面
点击”任务维护”→“查询操作任务”进入。
3.2.2 查询任务
●可选择业务类型,输入任务ID查询任务列表。
●可以输入任务名称进行查询,支持模糊匹配;
●可以选择任务类型进行查询;
●多种查询条件可任意组合;
●默认显示所有的任务列表。
●显示的内容包括:
✓任务ID、任务名称;
✓程序路径、程序类名、程序运行参数;
✓程序定时运行Quartz表达式;
✓业务类型;
✓指定运行的主机名;
3.2.3 运行任务
●点击某条任务前面的”运行”超链接,弹出提交任务的弹出框:
●填入业务日期,日期格式必须与程序运行参数中指定的日期格式一致。
选择是否需要运行子任务:
✓如果选择”不运行子任务”,则只运行该任务本身;
✓如果选择”运行子任务”,则会将该任务及所有该任务的子孙任务依次运行(运行失败的任务其子任务不会运行);
●点击”提交”按钮,弹出框中会显示任务的提交结果:
●如果显示”true,任务提交成功”,则表示任务提交成功,关闭后跳转至任
务监控页面。
如果显示”false”,则表示任务提交不成功,同时将相关的原因显示出。
3.2.4 查看任务依赖
在任务查询页面点击“依赖”超链接,跳转到任务依赖页面,显示该任务的下级依赖任务。
详见第4章介绍。
3.2.5 修改任务
在任务查询页面点击“修改”超链接,跳转至修改该任务的页面。
●修改任务属性,点击”修改任务”按钮。
弹出框显示修改结果。
●和添加任务结果类似,如果显示修改过的任务信息,则表示修改成功,
关闭后跳转至任务查询页面,显示该任务信息。
如果是其他信息,则表示修改失败。
3.2.6 删除任务
●在任务查询页面点击”删除”超链接,弹出删除任务确认对话框。
●点击”删除”按钮,显示任务删除操作结果。
●如果显示”true”,则表示删除成功,否则删除失败,并且会提示失败原
因。
注意:当一个任务依赖其他任务,或者被其他任务依赖,则不能删除。
必须先删除其依赖关系,之后才能删除任务。
第4章任务依赖
4.1 查询依赖
输入任务ID,选择”找下级”或者”找下级”,点击“查询”。
●默认会显示任务树中所有任务昨天执行的结果状态图示;
●如果需要查询某一个业务日期的执行结果图示,则填入业务日期和任务
ID,查询即可。
4.2 添加任务依赖
●点击”添加依赖”按钮,出现添加任务依赖弹出框,填入父任务ID和子
任务ID,点击”添加”按钮。
●结果显示”true”,则添加成功,”false”,添加失败。
●注意:输入的父任务ID和子任务ID必须存在,也就是说,必须先添加
任务,之后才能添加任务依赖。
4.3 删除任务依赖
●点击”删除依赖”按钮,出现删除任务依赖弹出框,填入父任务ID和子
任务ID,点击”删除”按钮。
●结果显示”true”,则删除成功,”false”,删除失败。
4.4 查看任务最后一次运行详情
●在任务依赖图中点击一个任务ID,出现弹出框,显示该任务最后一次
运行详情。
其中,点击运行日志中的URL,可查看任务运行日志。
第5章任务监控
5.1 页面
点击”任务监控”菜单进入。
默认显示前10条任务运行历史(按照创建时间排序)。
5.2 查询任务运行历史
根据任务状态、任务ID、任务实例ID、任务创建时间(任务运行记录创
建时间)、业务日期这几个条件任意组合筛选查询;
●显示的内容包括:任务ID、任务实例ID、运行节点、任务状态、业务
时间、任务开始时间、任务结束时间、运行日志、提交标记、等待标
记。
●提交标记:0,表示系统自动提交的任务;1,表示用户手动提交的任
务;
●等待标记:当任务状态为等待(WAITTING)时才有意义。
0,表示没有
资源而等待;1,表示父任务未全部完成而等待。
5.3 查看任务运行日志
●点击任务监控页面某个运行记录中运行日志的URL,即可打开该任务实
例的运行日志页面。
5.4 重做任务
在任务监控页面,当任务状态为结束状态(SUCCESS、FAILED、KILLED)时候,点击任务实例左侧的”重做任务”超链接,出现提交任务的弹出框。
业务日期默认为任务实例中的业务日期(可修改),选择是否运行子任务,点击”提交”按钮。
结果中出现”true,提交成功”则表示提交成功。
5.5 KILL任务
在任务监控页面中,当任务状态为等待(WAITTING)或者正在运行(RUNNING)时候,可以进行KILL操作。
点击”KILL”超链接,出现Kill任务的弹出框,点击”Kill”按钮。
结果显示”true”,则表示Kill成功,任务状态被更新为KILLED。
第6章告警配置
6.1 添加任务告警
点击”告警配置”→“添加任务告警”进入。
●告警标记:
✓失败告警:当任务执行失败时候触发告警;
✓定时告警:当任务在定时的时间内未成功结束时候触发告警(暂未实现);
●告警时间:当告警标记为定时告警时候,选择定时告警时间,格式为
时:分。
●告警类型:
✓邮件告警:发送告警邮件;
✓短信告警:发送告警短信(暂未实现);
✓邮件和短信告警:同时发送告警邮件和告警短信(暂未实现);
●邮件列表:当告警类型中包含邮件告警时候,填入收件人邮箱列表,分
号分隔;
●手机列表:当告警类型中包含短信告警时候,填入收信人手机号列表,
分号分隔;(暂未实现)
6.1.1 任务失败告警
填入任务ID,告警标记选择”失败告警”,选择告警类型,填入邮件列表或手机列表,点击”添加”。
弹出框显示”true”,表示添加成功。
之后跳转至“查询配置任务告警”页面。
6.1.2 任务超时未完成告警
6.2 查询任务告警配置
点击”告警配置” ”查询配置任务告警”进入。
可输入任务ID查询。
6.3 修改任务告警
在查询任务告警配置页面中点击“修改”超链接,进入修改告警配置页面。
修改相关信息,点击“修改”按钮,弹出框显示修改结果。
6.4 删除任务告警
在查询任务告警配置页面中点击“删除”超链接,出现删除任务告警弹出框,点击”删除”按钮确认删除。
6.5 查询告警发送记录
●点击“告警配置”→“查询任务告警发送记录”菜单进入。
●可根据任务ID、告警发送时间、告警发送状态进行筛选查询。
●告警发送状态:0,表示发送成功;1,表示发送失败。
第7章系统部分运行原理
7.1 业务类型
由于每种业务类型的任务,开发和生产环境使用的用户都不一样,不同业务的任务,需要用不同的用户去执行,因此,在添加任务时候,选择正确的业务类型非常重要。
在使用系统之初,需要与管理员沟通确定你的业务类型名称,以及该业务类型使用哪个用户。
系统使用root用户运行服务,当需要调度某个任务时,会根据该任务的业
务类型,从元数据中获取该业务类型的用户名,然后su到该用户去执行程序。
7.2 程序路径
由于系统会存在多个JobWorker,如果任务没指定运行主机,就有可能被分配到任一JobWorker上,那么保存任务程序脚本的存储必须使得每个JobWorker 都能访问到,最好的解决办法就是使用HDFS。
当JobWorker获取到一个可执行的任务时候,会判断该任务的程序路径,
●如果以”hdfs://”开头,表示存放于HDFS上,接下来在本地创建一个工
作目录,从HDFS上将程序脚本下载到本地工作目录,使用本地工作目
录中的程序脚本执行程序,结束后,将此次任务运行的工作目录删除。
●如果不以“hdfs://”开头,表示存放于JobWorker本地,直接使用该路径
来执行程序。
需要注意的是:
不论是程序路径存放在JobWorker本地还是HDFS,都必须使得业务类型对应的用户有访问权限。
7.3 指定任务运行主机
有些业务的程序复杂,在之前使用的机器上运行很久了,不好迁移。
这时候,可以将系统的JobWorker服务运行在该机器上,这样,也可以不用迁移程序,使用调度系统。
在添加任务的时候,指定任务的运行主机为你的机器主机名,这样,JobManager在分配任务资源的时候,会将你的任务分配到你的机器上,而不会分配到其他的JobWorker上。
有这种需求的提前和管理员联系。
7.4 调度的延迟
系统采用类似生产者消费者的模式,JobManager和JobMonitor会将待运行的任务放入元数据库中的任务池表,由JobWorker周期性获取属于自己的任务,这样就会有延迟。
这个延迟时间和各个服务扫描数据库的周期有关,考虑对数据库的压力,目前设置的稍长,综合下来,任务的调度延迟一般在10秒以内。
7.5 任务执行命令
系统会根据任务的程序路径、程序类名、程序运行参数拼接成任务执行命
令。
●JAVA
java –jar 程序路径程序类名程序运行参数
●MR
hadoop jar程序路径程序类名程序运行参数
●SHELL
sh 程序路径程序运行参数
●PYTHON
python程序路径程序运行参数
第8章HTTP接口
8.1提交运行任务
请求URL:${skynetHost}:${skynetPort}/skynet/submitjob
请求类型:POST/GET
请求参数:
返回格式:
{
"status":0, //status 为0表示提交成功
"msg":"[true,0,job [278] 提交成功,jobInstanceId:[25589], job_run_host:[idc-ds20-ad-02], job_batch_no:[1234],
job_business_time:[2015-05-04] ..,]"
}
8.2 KILL任务
请求URL:${skynetHost}:${skynetPort}/skynet/killjob
请求类型:POST/GET
返回格式:
{
"status":0, //status 为0表示提交成功
"msg":[true,0,null]
}
8.3 查询任务运行状态和历史
请求URL:${skynetHost}:${skynetPort}/skynet/queryjoblog
请求类型:POST/GET
返回格式:
{
"status":0,
"msg":[
{"action":0,"job_app_location":"","job_batch_no":1233,"job_business_time":"2015-05-04","job_business_type":"","job_class_name":"","job_end_time":null,"job_id":278,"job_instance
_id":25388,"job_last_update_time":"","job_run_args":"","job_run_host":"idc-ds20-ad-02","job_run_log":"http://idc-ds20-ad-02:9911/2015-05-05/job-278-
25388.log","job_run_time":"2015-05-05 10:36:30.0","job_start_time":"2015-05-05
10:35:32.0","job_status":"RUNNING","job_submit_flag":1,"job_type":"","job_wait_flag":0},
{"action":0,"job_app_location":"","job_batch_no":0,"job_business_time":"2015-05-04","job_business_type":"","job_class_name":"","job_end_time":"2015-05-04
15:39:18.0","job_id":278,"job_instance_id":25333,"job_last_update_time":"","job_run_args":"", "job_run_host":"idc-ds20-ad-02","job_run_log":"http://idc-ds20-ad-02:9911/2015-05-04/job-278-25333.log","job_run_time":"2015-05-04 15:40:12.0","job_start_time":"2015-05-04
15:39:03.0","job_status":"SUCCESS","job_submit_flag":0,"job_type":"","job_wait_flag":0},
{"action":0,"job_app_location":"","job_batch_no":1232,"job_business_time":"2015-05-04","job_business_type":"","job_class_name":"","job_end_time":"2015-05-04
15:28:00.0","job_id":278,"job_instance_id":25332,"job_last_update_time":"","job_run_args":"", "job_run_host":"idc-ds20-ad-02","job_run_log":"http://idc-ds20-ad-02:9911/2015-05-04/job-278-25332.log","job_run_time":"2015-05-04 15:28:51.0","job_start_time":"2015-05-04
15:27:45.0","job_status":"SUCCESS","job_submit_flag":1,"job_type":"","job_wait_flag":0}
]
}
附录A 动态时间参数
系统中附带了动态时间参数的解析功能,方便用户使用。
格式如下:
●${yyyy-MM-dd,-1d},将当前时间减一天(-1d),格式为yyyy-MM-dd。
比如:程序自动运行时候日期为2014年10月24日,则会将该参数
替换为2014-10-23.
●${yyyy-MM-dd-HH,-2H},将当前时间减2小时(-2H),格式为yyyy-MM-
dd-HH。
比如:程序自动运行时候时间为2014年10月24日14时,
则会将该参数替换为2014-10-24-12。
●参数中的时间格式需要是Java支持的日期格式。
示例:
任务A的运行参数为
”/user/hive/warehouse/tableA/dt=${yyyy-MM-dd,-2d}”,那么2014年10月
24日,调度系统在自动触发该任务时候会将参数替换为
”/user/hive/warehouse/tableA/dt=2014-10-22”,作为最终的参数传给程序
运行。
特别注意:
●动态时间参数在任务自动调度触发时候才会根据当前时间来替换;
●手工提交任务时,会用填入的业务日期将参数中的动态日期参数直
接替换,不会做计算。
比如:上面示例中的任务A,用户手动运行该
任务,并且,填入了业务日期2014-10-24,则最终的参数为
” /user/hive/warehouse/tableA/dt=2014-10-24”.
●手工提交任务时候,会根据程序运行参数中的动态日期格式来判断
填入的业务日期是否符合格式,比如:任务A中的动态日期参数为
${yyyy-MM-dd,-2d},那么手工运行任务A时候,填入的业务日期格
式只能是yyyy-MM-dd,其他均会提示不符合日期格式。
●假如一个任务程序运行参数中没有动态日期参数,那么会将当前日
期作为该任务的业务日期,格式为yyyy-MM-dd。
附录B Quartz时间表达式
参考网址:/blog/1200356
常用的表达式:
0 0 12 * * ? 每天12点触发
0 15 10 ? * * 每天10点15分触发
0 48 * ? * * 每小时48分触发
其他不常用:
0 0 12 * * ? 每天中午12点触发
0 15 10 ? * * 每天上午10:15触发
0 15 10 * * ? 每天上午10:15触发
0 15 10 * * ? * 每天上午10:15触发
0 15 10 * * ? 2005 2005年的每天上午10:15触发
0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
0 15 10 15 * ? 每月15日上午10:15触发
0 15 10 L * ? 每月最后一日的上午10:15触发
0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发
每天早上6点
0 6 * * *
每两个小时
0 */2 * * *
晚上11点到早上7点之间每两个小时,早上八点
0 23-7/2,8 * * *
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3
1月1日早上4点
0 4 1 1 *
附录C 定时任务配置流程
●进入”添加任务”页面:点击”任务维护”→“添加任务”;
●填入任务相关信息,主要是填入”程序定时运行时间”中的Quartz表达式;
●点击”添加任务”按钮,添加成功后即可完成定时任务的配置。
附录D 依赖任务配置流程
假设有父任务A,子任务B,子任务C。
B和C均依赖A;
●在系统中分别添加任务A、B、C;
●添加任务成功之后,再添加任务依赖,在任务依赖页面中点击”添加依
赖”按钮;
●任务依赖需要添加两次,A->B,A->C;
●在添加任务依赖弹出框中填入父任务ID:A,子任务ID:B,点击”添
加”按钮;
●同样方法再添加A->C的依赖。
●添加完毕后,可以在任务依赖页面,输入任务ID:A,选择“找下级”,
查询任务依赖是否正确。
●注意:
✓一般根节点任务都是定时任务,如上面中的任务A。
✓当一个任务既有父任务,又有定时运行时间时,会将定时运行忽略,等待父任务完成后才触发。