Scheduling workflow¶
Setting up a schedule¶
To run a workflow periodically, add a schedule:
option to top-level workflow definitions.
timezone: UTC
schedule:
daily>: 07:00:00
+step1:
sh>: tasks/shell_sample.sh
In schedule:
directive, you can choose one of following options:
Syntax |
Description |
Example |
---|---|---|
hourly>: |
Run this job every hour at MM:SS |
hourly>: 30:00 |
daily>: |
Run this job every day at HH:MM:SS |
daily>: 07:00:00 |
weekly>: |
Run this job every week on DDD at HH:MM:SS |
weekly>: Sun,09:00:00 |
monthly>: |
Run this job every month on D at HH:MM:SS |
monthly>: 1,09:00:00 |
minutes_interval>: |
Run this job every this number of minutes |
minutes_interval>: 30 |
cron>: |
Use cron format for complex scheduling |
cron>: 42 4 1 * * |
Note
When a field is starting with *
, enclosing in quotes is necessary by a limitasion to be a vaild YAML.
digdag check
command shows when the first schedule will start:
$ ./digdag check
...
Schedules (1 entries):
daily_job:
daily>: "07:00:00"
first session time: 2016-02-10 16:00:00 -0800
first scheduled to run at: 2016-02-10 23:00:00 -0800 (in 11h 16m 32s)
Note
hourly
, daily
, weekly
or monthly
, a session time may not be same with actual run time.hourly
, hour’s 00:00).schedule |
first session time |
first scheduled to run at |
---|---|---|
hourly>: “32:32” |
2019-02-24 14:00:00 +0900 |
2019-02-24 14:32:32 +0900 |
daily>: “10:32:32” |
2019-02-25 00:00:00 +0900 |
2019-02-25 10:32:32 +0900 |
weekly>: “2,10:32:32” |
2019-02-26 00:00:00 +0900 |
2019-02-26 10:32:32 +0900 |
monthly>: “2,10:32:32” |
2019-03-02 00:00:00 +0900 |
2019-03-02 10:32:32 +0900 |
Running scheduler¶
digdag scheduler
command runs the schedules:
$ ./digdag scheduler
When you change workflow definition, the scheduler reloads digdag.dig
file automatically so that you don’t have to restart it.
Checking scheduling status¶
You can use Client-mode commands to manage the schedules.
Note
The scheduler command listens on http://127.0.0.1:65432
by default. It accepts connection only from 127.0.0.1 (localhost). This is for a security reason so that it doesn’t open the port to the public network. To change the listen address, please use --bind ADDRESS
option.
Setting an alert if a workflow doesn’t finish within expected time¶
timezone: UTC
schedule:
daily>: 07:00:00
sla:
# triggers this task at 02:00
time: 02:00
+notice:
sh>: notice.sh
+long_running_job:
sh>: long_running_job.sh
In sla: directive, you can select either the time
or duration
option.
Options¶
This parameter supports fail: BOOLEAN and alert: BOOLEAN options. Setting fail: true makes the workflow failed. Setting alert: true sends an notification using above notification mechanism.
Setting
fail: true
makes the workflow failed.Setting
alert: true
sends an notification using above notification mechanism.
Skipping a next workflow session¶
Sometimes you have frequently running workflows (e.g. sessions every 30 or 60 minutes) that take longer than the duration between sessions. This variability in the duration of a workflow can occur for a number reasons. For example, you may be seeing an increase in the amount of data you are normally processing.
For example, let’s say we have a workflow that is running hourly, and it normally takes only 30 minutes. But it’s the holiday season and now there has been a huge increase in usage of your site – so much data is now being process the workflow is taking 1 hour and 30 minutes. During this time period, a 2nd workflow has started running for the following hour, which causes further strain on your available resources because both are running at the same time.
It’s this case it’s best to skip the next hour’s workflow session, and instead utilize the subsequent session to process 2 hours of data. To do this, we’ve added the following:
Added a
skip_on_overtime: true | false
schedule option that can be used to control whether scheduled session execution should be skipped if another session is already running.Scheduled workflow sessions now have a
last_executed_session_time
variable which contains the previously executed session time. It is usually same withlast_session_time
but has different value whenskip_on_overtime: true
is set or the session is the first execution.
Skipping backfill¶
The skip_delayed_by
option enables backfill command to skip creating sessions delayed by the specified time. When Digdag restarts, sessions of a schedule are automatically created until the next of last_session_time
.
For example, If Digdag restarts at 20:00:00 and a workflow scheduled as below, it creates three sessions (19:59:00, 19:58:00 and 19:57:00). And then, Digdag doesn’t create sessions which are before 19:56:00 by the option.
schedule:
minutes_interval>: 1
skip_delayed_by: 3m
+setup:
sh>: echo ${session_time}
Also, if your workflow starts with delay skip_delayed_by
option takes effect as well.
For example, your scheduling looks like this.
If the workflow is executed at 16:02 due to some reason, the session will be skipped because skip_delayed_by
is set to 1s and it is too late for the configured value.
schedule:
cron>: '0 16 * * *'
skip_delayed_by: 1s
Set start/end¶
The start
and end
options set period of schedule.
The option accepts date format YYYY-MM-DD.
When start
is set, the schedule will start on and after start
.
When end
is set, the schedule will run until the day (include the day).
When next run time will be after the end
, next schedule will be set to 9999-01-01 00:00:00+0000 and never kicked.
Note
After the schedule ends, if you change end
date to extends the period, the schedule will be resumed from the last session.
It causes multiple session running unexpectedly.
For example, you set end: 2022-03-31 and current date is 2022-04-15.
Then you update end: 2022-04-31, the sessions between 2022-04-01 and 2022-04-15 will be kicked.
To avoid the case, recommend to set skip_delayed_by
.