iT邦幫忙

2023 iThome 鐵人賽

DAY 19
1
AI & Data

Airflow 是什麼? 能吃嗎 ? 數據水管工的超級蘑菇系列 第 19

[Day19] Airflow Scheduler 排程爬坑筆記(上)

  • 分享至 

  • xImage
  •  

Before 爬坑/images/emoticon/emoticon68.gif

Today Practice

今天繼續使用昨天的安裝模組的 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()

注意事項

  • 為了避免混淆,我們先維持 airflow 上的時區,UTC+0(就是以前在課本上聽到英國的格林威治標準時間),台灣是UTC+8,所以等等提到的都是英國的時間喔
  • 時區也是巨坑,少碰為妙/images/emoticon/emoticon02.gif

設定 schedule 排程間隔

三種設定方法

schedule 預設是 None

  1. datetime.timedelta 設定間隔
from datetime import timedelta
@dag(
    dag_id = "test_dag"
    schedule_interval=timedelta(days=1),
    start_date = datetime(2023, 10, 4)
)
  • 代表從10月5號開始開始每天半夜12點執行一次
  1. Crontab 預設(preset)
import datetime
@dag(
    dag_id = "test_dag"
    schedule_interval="30 9 * * *",
    start_date = datetime(2023, 10, 4)
)
  • 代表從10月5號開始每天早上9點半執行一次
  1. Cron 表達式(Expressions)
import datetime
@dag(
    dag_id = "test_dag"
    schedule_interval="@daily",
    start_date = datetime(2023, 10, 4)
)
  • 代表從 10 月 5 號開始每天半夜12點執行一次

有發現哪裡很奇怪嗎?明明 start_date 就是設定 10/4 開始,為什麼我都寫說是 10/5 執行

在 Airflow Scheduler 排程巨坑當中的第一關,就是必須知道:

執行時間 ≠ start_date

執行時間= start_dateschedule_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 是什麼

crontab 是 linux系統 或是遠端伺服器當中常常用來來定期執行命令的排程工具,像是定期執行 python 程式、定期資料庫備份等等,Crontab 預設(preset) 和 Cron 表達式(Expressions) 都是在設定排程時間必須要知道的基本知識,那 airflow 身為排程大師,當然會延續這兩項好用的設定方式,改善其他不好用的東西啊/images/emoticon/emoticon39.gif

真的想認真學 linux 當中的 crontab 詳細內容,歡迎參考鳥哥的網站,裡面有滿滿寶藏
第十五章、例行性工作排程(crontab)

Crontab 預設(preset)

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 *

Cron 表達式(Expressions) 基本語法

┌───────────── 分鐘   (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 表達式,就會直接顯示排程時間
https://ithelp.ithome.com.tw/upload/images/20231004/20135427vtVJdqbLcL.png

結語

今天的內容還不算有什麼坑,只算是在坑的邊緣看一看,明後天應該就會被推進去了


上一篇
[day18] 急!在線等!求解20 點!Airflow 安裝 Python 模組
下一篇
[Day20] Airflow Scheduler 排程爬坑筆記(下)
系列文
Airflow 是什麼? 能吃嗎 ? 數據水管工的超級蘑菇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言