
# 离散小时调度与作业最近依赖调度逻辑
数据开发当前支持两种调度依赖策略：传统周期调度依赖和自然周期调度依赖。
传统周期调度依赖的详细信息请参见[传统周期调度](https://support.huaweicloud.com/bestpractice-dataartsstudio/dataartsstudio_05_0219.html)。
自然周期调度依赖的详细信息请参见[自然周期调度](https://support.huaweicloud.com/bestpractice-dataartsstudio/dataartsstudio_05_2222.html)。
随着用户业务的演进，自然周期调度中，增加了许多新的调度规则，如离散小时调度，最近依赖调度等。本章节详细讲解这两个调度规则。
#### 离散小时调度
**场景一**：离散小时依赖月、周、天 ，或者月、周、天依赖离散小时， 这六种依赖，依赖的时间范围都是依赖自然天内的所有作业实例。
表1离散小时调度依赖逻辑一 
| 场景      | 依赖处理逻辑                                                                                                                                                                                                                                                                                                                                                                                            |
|:---|:---|
| 离散小时依赖月 | 依赖时间段范围是\[当天的零点,下一天的零点) 这个时间段的作业实例是否跑成功。区间段范围是前闭后开。 **示例一**：作业A是离散小时调度，调度时间分别是2/5/15点；作业B是月调度，每月3号12点调度。A依赖B，假设今天是每月3号， 作业A在2点、5点、15点的实例，都会依赖作业B在12点的实例，等到作业B在12点的实例执行成功后，才会执行作业A的实例。 **示例二**：作业是A离散小时调度，调度时间分别是2/5/15点；作业B是月调度，每月3号12点调度。A依赖B，假设今天不是每月的3号，即今天没有作业B的实例，则因为依赖的作业B在今天没有实例，作业A在2点、5点、15点的实例会直接运行。   |
| 月依赖离散小时 | 依赖时间段范围是\[当天的零点,下一天的零点) 这个时间段的作业实例是否跑成功。区间段范围是前闭后开。 **示例**：作业A是离散小时调度，调度时间分别是2/5/15点；作业B是月调度，每月3号12点调度。B依赖A，当作业B在每月3号调度时，作业B在12点的实例，会等依赖的作业A在2/5/15点的实例，都执行成功后，才会开始调度。                                                                                                                                                                                    |
| 离散小时依赖周 | 依赖时间段范围是\[当天的零点,下一天的零点) 这个时间段的作业实例是否跑成功。区间段范围是前闭后开。 **示例一**：作业A是离散小时调度，调度时间分别是2/5/15点；作业B是周调度，每周星期一12点调度。A依赖B，假设今天是每周星期一，作业A在2点、5点、15点的实例，都会依赖作业B在12点的实例，等到作业B在12点的实例执行成功后， 才会执行作业A的实例。 **示例二**：作业A是离散小时调度，调度时间分别是2/5/15点；作业B是周调度，每周星期一12点调度。A依赖B，假设今天不是星期一，即今天没有作业B的实例， 则因为依赖的作业B在今天没有实例，作业A在2点、5点、15点的实例会直接运行。 |
| 周依赖离散小时 | 依赖时间段范围是\[当天的零点,下一天的零点) 这个时间段的作业实例是否跑成功。区间段范围是前闭后开。 **示例**：作业A是离散小时调度，调度时间分别是2/5/15点；作业B是周调度，每周星期一12点调度。B依赖A，当作业B在星期一调度时，作业B在12点的实例，会等依赖的作业A在2/5/15点的实例，都执行成功后，才会开始调度。                                                                                                                                                                                  |
| 离散小时依赖天 | 依赖时间段范围是\[当天的零点,下一天的零点) 这个时间段的作业实例是否跑成功。区间段范围是前闭后开。 **示例**：作业A是离散小时调度，调度时间分别是2/5/15点；作业B是天调度，每天12点调度。A依赖B，则作业A在2点、5点、15点的实例，都会依赖作业B在12点的实例，等到作业B在12点的实例执行成功后，才会执行作业A的实例。                                                                                                                                                                                 |
| 天依赖离散小时 | 依赖时间段范围是\[当天的零点,下一天的零点) 这个时间段的作业实例是否跑成功。区间段范围是前闭后开。 **示例**：作业A是离散小时调度，调度时间分别是2/5/15点；作业B是天调度，每天12点调度。B依赖A，则作业B在12点的实例，会等依赖的作业A在2/5/15点的实例，都执行成功后，才会开始调度。                                                                                                                                                                                                |
   
**场景二**：离散小时依赖小时、分钟、离散小时， 或者小时、分钟依赖离散小时，依赖都遵循如下规则。
- 规则一：自然天内，依赖关系中的上游、下游任务数量一致，则上游、下游一对一依赖。 解释：例如作业A依赖作业B，作业A是离散小时调度，每天3/6/8点运行，则作业A一天内有3个实例；作业B小时作业，间隔8小时调度一次，每天0点、8点、16点调度，则作业B一天也是3个实例。
  上游作业B与下游作业A在一天内，都是3个实例，则作业A与作业B一对一依赖。
  所以作业A与作业B的依赖情况为： 作业A在3点的实例，依赖作业B在0点的实例；作业A在6点的实例，依赖作业B在8点的实例；作业A在8点的实例，依赖作业B在 16点的实例。
  

- 规则二：自然天内，上下游任务数量不一致，下游任务运行当天生成的周期实例，将会根据就近原则挂载依赖，依赖距离自己定时运行时间最近的上游实例。 先向前找上游依赖实例，依赖上游一整个区间内的实例；向前未找到依赖的实例时，需要向后找，向后查找时，只依赖最近的一个实例。
  通过图表进一步进行原理解释：
  "先向前找上游依赖实例，依赖上游一整个区间内的实例" 解释如下：
  图1先向前找上游依赖实例，依赖上游一整个区间内的实例   
  ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001961317813.png "点击放大")
  "向前未找到依赖的实例时，需要向后找，向后查找时，只依赖最近的一个实例" 解释如下：
  图2向前未找到依赖的实例时，需要向后找，向后查找时，只依赖最近的一个实例   
  ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001961318393.png "点击放大") 
表2离散小时调度依赖逻辑二 
| 场景         | 依赖处理逻辑                                                                                                                                                                                                                                                |
|:---|:---|
| 离散小时依赖小时   | 依赖时间段范围是\[当天的零点，下一天的零点) ，离散小时作业A，小时作业B，作业A依赖作业B。 当离散小时作业A、小时作业B在一天内的实例数量一致时，适用规则一，一对一依赖； 当离散小时作业A、小时作业B在一天内的实例数量不一致，适用规则二，向前就近找一整个区间的上游实例依赖；未找到，向后找最近的一个实例依赖。         |
| 小时依赖离散小时   | 依赖时间段范围是\[当天的零点，下一天的零点) ，小时作业A，离散小时作业B，作业A依赖作业B。 当小时作业A、离散小时作业B在一天内的实例数量一致时，适用规则一，一对一依赖； 当小时作业A、离散小时作业B在一天内的实例数量不一致，适用规则二，向前就近找一整个区间的上游实例依赖；未找到，向后找最近的一个实例依赖。         |
| 离散小时依赖分钟   | 依赖时间段范围是\[当天的零点，下一天的零点) ，离散小时作业A，分钟作业B，作业A依赖作业B。 当离散小时作业A、分钟作业B在一天内的实例数量一致时，适用规则一，一对一依赖； 当离散小时作业A、分钟作业B在一天内的实例数量不一致，适用规则二，向前就近找一整个区间的上游实例依赖；未找到，向后找最近的一个实例依赖。         |
| 分钟依赖离散小时   | 依赖时间段范围是\[当天的零点，下一天的零点) ，分钟作业A，离散小时作业B，作业A依赖作业B。 当分钟作业A、离散小时作业B在一天内的实例数量一致时，适用规则一，一对一依赖； 当分钟作业A、离散小时作业B在一天内的实例数量不一致，适用规则二，向前就近找一整个区间的上游实例依赖；未找到，向后找最近的一个实例依赖。         |
| 离散小时依赖离散小时 | 依赖时间段范围是\[当天的零点, 下一天的零点) ，离散小时作业A，离散小时作业B，作业A依赖作业B。 当离散小时作业A、离散小时作业B在一天内的实例数量一致时，适用规则一，一对一依赖； 当离散小时作业A、离散小时作业B在一天内的实例数量不一致，适用规则二，向前就近找一整个区间的上游实例依赖；未找到，向后找最近的一个实例依赖。 |
   
#### 最近依赖调度
最近依赖调度，是在自然周期调度的基础上，对于天依赖小时、天依赖分钟、小时依赖分钟这三种依赖场景，支持选择依赖最近的作业实例。
表3最近依赖调度 
| 场景             | 依赖处理逻辑                                                                                                                                                                                                                                                      |
|:---|:---|
| 天依赖小时（勾选最近依赖）  | 依赖时间段范围是\[当天的零点，下一天的零点) ，不可跨天。 **示例一**：天作业A每天8点调度；小时作业B每小时15分钟开始调度。则天作业A依赖最近的小时作业实例，即依赖7点15分的小时作业实例。 **示例二**：天作业A每天0点30分调度；小时作业B每小时40分钟开始调度。因为天作业前面没有小时任务，则天任务不依赖任何小时任务，直接运行。 |
| 天依赖分钟（勾选最近依赖）  | 依赖时间段范围是\[当天的零点, 下一天的零点) ，不可跨天。                                                                                                                                                                                                                             |
| 小时依赖分钟（勾选最近依赖） | 往前找到最近的分钟任务，挂载依赖。 **示例**：小时作业A每小时15分钟开始调度；分钟作业B从凌晨一点开始每15分钟调度一次。则小时作业A在0点15分的实例，依赖分钟作业B在昨天23点45分的实例；小时作业A在1点15分的实例，依赖分钟作业B在1点15分的实例。                                                                                |
   
