在大数据平台中,任务调度、依赖管理、数据产出质量、幂等处理都是保障业务稳定可靠的关键。DataLeap 提供了任务调度依赖、自依赖、偏移量、就近依赖等机制。在产品中可配置不同周期任务(分钟、小时、天、周、月)之间的依赖关系,满足复杂场景下数据开发与调度的场景。下面将基于数据开发与调度配置过程中一些典型场景进行总结。
在 DataLeap 中,您可对不同的任务配置上下游依赖关系,完成数据血缘的构建以及调度,确保数据质量,详细配置方式可参考:任务调度依赖。
每个任务应清晰定义其调度周期(小时、日等)、定时时间、业务时间(如 ${DATE}/${HOUR})等。周期任务会按调度类型生成对应数量的“周期实例”。
变量 | 含义 | 格式 | 示例 |
|---|---|---|---|
${DATE} | 获取业务时间日期 | yyyy-MM-dd | 天任务:2019/01/02 8点执行,${DATE} =2019-01-01 |
${date} | 获取业务时间日期 | yyyyMMdd | 天任务:2019/01/02 8点执行,${date} =20190101 |
${day} | 获取业务时间日期 | dd | 天任务:2019/01/02 8点执行,${day} =01 |
${HOUR} | 获取业务时间整点 | h(整数) | 天任务:2019/01/02 8点执行,${HOUR} =0 |
${hour} | 获取业务时间整点 | hh | 天任务:2019/01/02 8点执行,${hour} =00 |
${MINUTE} | 获取业务时间整分钟 | m(整数) | 天任务:2019/01/02 08:10点执行,${MINUTE} =0 |
${minute} | 获取业务时间整分钟 | mm | 天任务:2019/01/02 08:10点执行,${minute} =00 |
${month} | 获取业务时间月份 | MM | 天任务:2019/01/02 8点执行,${month} =01 |
${year} | 获取业务时间年份 | yyyy | 天任务:2019/01/02 8点执行,${year} =2019 |
${timestamp} | 获取业务时间时间戳 | XXXXXX...(整数) | 天任务:2019/01/02 8点执行,${timestamp} =1546272000 |
${last_DATE} | 获取业务时间所处月份的最后一天 | yyyy-MM-dd | 天任务:2019/01/02 8点执行,${last_DATE} =2019-01-31 |
${last_date} | 获取业务时间所处月份的最后一天 | yyyyMMdd | 天任务:2019/01/02 8点执行,${last_date-1} =20181231 |
${last_day} | 获取业务时间所处月份的最后一天 | dd | 天任务:2019/01/02 8点执行,${last_day-1} =31 |
${DTF-xxxx} | 自定义时间格式 | xxxx | 天任务:2019/01/02 8点执行,${DTF-ddMMyy} =010119 |
说明
基本运算法则:往前或者往后n个单位时间
高级运算法则:${var+x+ym-zd+ph+qi},其中var代表时间变量,m代表月,d代表天,h代表小时,i代表分钟
建议在任务代码中使用调度参数(如 ${DATE}/${HOUR})来做分区筛选、路径拼接等,从而保证任务对业务时间的聚焦与可追溯性。
小时级任务,即任务实例生成按小时级周期生成,在上游数据就绪后,即会发起调度执行,小时级任务可以配置周期型上游任务依赖。
说明
注意:
针对小时级作业,由于资源问题或数据产出延迟,会导致多个实例同时调度,在不配置自依赖的情况下,可能导致计算引擎压力突增,或引发任务产出数据相互覆盖!
如某小时级任务配置了天任务为上游依赖,那么该小时任务不做自依赖时,等待上游任务延期执行完成后(如 23:59 分执行完成),下游小时任务的 24 个实例将会并发启动。这往往会造成资源争用、数据覆盖、锁竞争、延迟放大或引擎压力突增等不利场景。
推荐操作:
对下游小时任务开启“自依赖”(也可称“本节点跨周期依赖”),意味着每一个小时实例依赖上一个小时实例成功(除了首小时可能还依赖天任务或上游其他任务)。这样就变成串行或半串行,而非并发,从而降低资源冲突、避免多个小时实例同时跑。
在 DataLeap 中,你应查找任务调度属性中“跨周期自依赖/自依赖”开关,并设置“最早回溯时间”(最早回溯时间用于指定从哪一个周期开始不强检上一个周期)。
总结:
因此,对小时任务建议配置如下:
场景说明:
场景 | 【推荐】小时任务设置自依赖 | 小时任务未设置自依赖 |
|---|---|---|
说明 |
|
|
调度逻辑 |
在数据开发中,小时级任务由于调度频率高,可能导致并发调度或任务重跑的情况,保证数据处理逻辑幂等尤为关键(“幂等”即任务重复运行不会导致数据错误或重复累加),建议进行以下操作。
注意
【推荐】SQL 语句中尽量选择 INSERT OVERWRITE 而非 INSERT INTO。当小时任务跑出结果,应覆盖该小时分区的数据,而不是在原有数据上再累加。这样即使任务重跑、重复触发,也不会产生重叠或错误累积。
dt = yyyy-mm-dd, hour = hh)或更细粒度分区。小时作业写入自己的小时分区,并用覆盖写入,从而满足幂等。Delete/Truncate分区 + Insert”或“合并删除逻辑”方式,以保证在作业重跑时不会产生重复。WHERE dt = '${date}' AND hour = '${hour}')避免不小心影响其他小时分区。说明
由于小时级任务执行实例较多,在不设置自依赖的情况下,调度执行乱序可能产生数据质量问题,建议给每个任务实例设置唯一标识(例如 ${project}_${taskName}_${date}_${hour}),如有重复运行,可以通过判断该标识是否已成功,就决定是否跳过或执行。
dt, hour、甚至 minute。在 StarRocks、ByteHouse、Hudi、Iceberg 等湖仓系统中,良好的分区/排序策略对写入、查询效率、重跑效率都尤为重要。监控操作详见:任务运维。