今天繼續使用昨天的安裝模組的 code,簡單好用~
import requests
from datetime import datetime
from airflow.decorators import dag, task
@dag(schedule="@daily", start_date=datetime(2023, 10, 4), catchup=False)
def test_dag():
@task
def show_version():
return {"requests version": requests.__version__}
show_version()
show_module_version()
schedule 預設是 None
datetime.timedelta
設定間隔from datetime import timedelta
@dag(
dag_id = "test_dag"
schedule_interval=timedelta(days=1),
start_date = datetime(2023, 10, 4)
)
import datetime
@dag(
dag_id = "test_dag"
schedule_interval="30 9 * * *",
start_date = datetime(2023, 10, 4)
)
import datetime
@dag(
dag_id = "test_dag"
schedule_interval="@daily",
start_date = datetime(2023, 10, 4)
)
有發現哪裡很奇怪嗎?明明
start_date
就是設定 10/4 開始,為什麼我都寫說是 10/5 執行
在 Airflow Scheduler 排程巨坑當中的第一關,就是必須知道:
start_date
start_date
+ schedule_interval
* n(最小為1)所以從 10/4 開始每天執行,就是 10/5,10/6,10/7....
如果從 10/4 10:00 開始每 5 分鐘執行呢? 10/4 10:05, 10/4 10:10, 10/4 10:15......
Q: 我就是想要 10/4 早上 10:00 執行?你說說看啊,怎麼那麼慢,你說說看啊~
A: 就把開始時間往前移就好了,可以設定 start_date:10/3 10:00 ,然後間隔一天,今天是 10/4,開始時間也可以是過去,或是設定 start_date:10/4 9:00 間隔1小時也可以,以此類堆
如果真的需要客製化的時間排程設定,可以研究看看 Airflow 2.2.5 之後引入的 Timetables 時間表,可以滿足跳過日期或週次之類的特別需求 Airflow Timetables
crontab 是 linux系統 或是遠端伺服器當中常常用來來定期執行命令的排程工具,像是定期執行 python 程式、定期資料庫備份等等,Crontab 預設(preset) 和 Cron 表達式(Expressions) 都是在設定排程時間必須要知道的基本知識,那 airflow 身為排程大師,當然會延續這兩項好用的設定方式,改善其他不好用的東西啊
真的想認真學 linux 當中的 crontab 詳細內容,歡迎參考鳥哥的網站,裡面有滿滿寶藏
第十五章、例行性工作排程(crontab)
Crontab 預設 | 意思 | 等同 Cron 表達式 |
---|---|---|
None | 不設定排程,可能是手動觸發或是外部觸發 | |
@once | 只執行唯一一次 | |
@continuous | 上一次執行完就接著執行 | |
@hourly | 每個小時結束時執行一次 | 0 * * * * |
@daily | 每天半夜12點執行一次 | 0 0 * * * |
@weekly | 每週星期天半夜12點執行一次 | 0 0 * * 0 |
@monthly | 每個月第一天半夜12點執行一次 | 0 0 1 * * |
@quarterly | 每季第一天半夜12點執行一次 | 0 0 1 */3 * |
@yearly | 每年1月1日半夜12點執行一次 | 0 0 1 1 * |
┌───────────── 分鐘 (0 - 59)
| ┌─────────── 小時 (0 - 23)
│ │ ┌───────── 日期 (1 - 31)
│ │ │ ┌─────── 月份 (1 - 12)
│ │ │ │ ┌───── 星期幾 (0 - 7,0 和 7 都是週日,6 是週六,以此類推)
│ │ │ │ │
* * * * *
*
代表全部
五個都*
,代表每分鐘都執行0 10 * * *
=> 每天早上10點執行0 10 5 10 *
=> 每年 10 月 5 號早上 10 點執行
怎麼辦完全記不起來~ 沒關係
crontab guru 網站上可以讓你練習,可以修改 crontab 表達式,就會直接顯示排程時間
今天的內容還不算有什麼坑,只算是在坑的邊緣看一看,明後天應該就會被推進去了