Skip to main content

Command Palette

Search for a command to run...

Airflow 最讓人頭痛的 start_date / execution_date

Published
1 min read
Airflow 最讓人頭痛的 start_date / execution_date
Z

Machine Learning Engineer, interest in MLOps, Recommendation System, Deep Learning, Large Language Model, Natural Language Processing, Distributed System, Kubernetes, Databases, Data Engineering and all the Engineering Best Practices.

Airflow 裡面的 start_dateexecution_date 對不熟悉的人說是很反直覺的。

TLDR

  • 在這篇文章中我會解釋為什麼 airflow 的 execution_date 跟我們想的不一樣

  • start_date, schedule_interval, execution_date, next_execution_date 的用法

在展開對這三個 term 的描述之前,請先記得我們在使用 airflow 的時候,如官方所建議的,都該使用 UTC+0 作為時區。

Why

start_dateexecution_date 之所以難懂,是因為一段時間的資料只有在時間過完之後才能進行處理,所以他們並不是大家字面上會以為的「任務的開始時間」、「任務的執行時間」,而是

  • 這個任務搜集的資料的開始時間

  • 這次任務搜集的資料的時間(其實也是開始時間)

什麼意思呢?

import datetime as dt
from airflow import DAG

dag = DAG(
  dag_id="some_dag",
  schedule_interval="@daily",
  start_date=dt.datetime(2023, 01, 01),
)

假設我們有一個如上面程式碼這樣的 DAG,那麼我們實際上在做的事情會是:

  • 在 2023/01/02 的時候,執行這個 dag,蒐集 2023/01/01 ~ 2023/01/02 的資料

  • 在 2023/01/03 的時候,執行這個 dag,蒐集 2023/01/02 ~ 2023/01/03 的資料

  • 在 2023/01/04 的時候,執行這個 dag,蒐集 2023/01/03 ~ 2023/01/04 的資料

(P.S. 我們必須等到 2 號的最一開始,也就是 1/1 過完的時候,才能搜集 01/01 ~ 01/02 的資料)

而已「在 2023/01/02 的時候,蒐集 2023/01/01 ~ 2023/01/02 的資料」這個 dag run 為例子,他的 execution_date 就是 2023/01/01,代表資料搜集區間的開始時間範圍,而不是這個 dag 實際執行的時間。而這個 dag 實際實際執行的時間則可以透過 next_execution_date 來得到

Usage

從上述的例子裡面我們也可以發現,如果你希望你的 daily dag 在 2023/01/01 就開始執行,那你應該:

schedule_interval="@daily",
start_date=dt.datetime(2022, 12, 31) #2023/01/01 - sechedule_interval

同理如果這是一個 hourly_dag,但也要在 2023/01/01 就執行的話:

schedule_interval="@hourly",
start_date=dt.datetime(2022, 12, 31, 23, 0, 0) #2023/01/01 - sechedule_interval

而由上面兩個例子可以看到,真實執行的時間都是 2023/01/01 但是因為 schedule_interval 的設定不同,execution_date 會是不一樣的。因此要得到這個 DAG 真正被執行的時間(也就是 2023/01/01)則需要透過 next_execution_date 來得到。

In the end

  1. 在新版的 airflow 官方建議用 logical_date 來取代命名容易讓人誤會的 execution_date

  2. 我想 execution_date 的意義會認人誤會,一部分的原因是因為我們常常不只用 airflow 來處理 ETL,而是使用他來管理各式 cronjob,因此才會用任務的執行時間來解讀他,而不是用資料蒐集的角度。

Acknowledge

  1. Photo by Estée Janssens on Unsplash

More from this blog

Hashnode Pro

這三天因為覺得自己會比較頻繁的寫作的關係,因此開始了 Hashnode Pro 的試用。這篇文章想紀錄試用 hashnode pro 的一些心得。 Pro (可能)會有更多曝光 這點是我從 hashnode 的 Feed 上觀察到的,似乎我的 personalized feed 上出現不少 hashnode pro 訂閱的作者。但也可能是倒因為果,因為有訂閱 pro 的人也可能比較認真的在寫文章。 title generation 在 Title 的旁邊有自動生成更好的標題的功能,這點我覺得滿...

May 29, 20231 min read

Rye: 另一個 Python 的套件管理工具

Rye 是 Armin Ronacher (Flask 的作者)在 2023 年 5 月發佈的一套 Python 套件管理工具。市面上已經有非常多 Python 套件管理工具,例如:Pipenv, Poetry。Armin Ronacher 本人並沒有,似乎也抗拒將 rey 與現存的工具做比較,然而他還是寫了個 issue(https://github.com/mitsuhiko/rye/discussions/6) 分享他為什麼想要開發 rye。 我自己試用 rye 一小段時間,並且應用在幾個...

May 25, 20231 min read

Continuously Descend

9 posts