Airflowのstart_dateとexecution_date (logical date)を把握する
見出し画像

Airflowのstart_dateとexecution_date (logical date)を把握する

Dentsu Digital Tech Blog

電通デジタルでバックエンド開発をしている松田です。この記事は、Dentsu Digital Advent Calendar 2021の22日目の記事です。

本記事ではAirflow FAQにも記載のある以下2つのAirflowのdateについて、名称からだと実態の想定が少し難しいと思われるので紹介してみます。

・start_date
・execution_date ( ~ Airflow 2.1) / logical date (Airflow 2.2 ~)

※ 本記事記載のスクリーンショット、コードはAirflow 2.2で確認しています。ローカルで動かしてみたい場合はAirflowのこちらのドキュメントを参照してみてください。

まずAirflowがどのように時間を認識してスケジュール実行しているかについて、Airflow2.2以降ではData Intervalという概念が取り入れられたのでそれに基づいて紹介します。上記挙げた2つの日付はData Intervalに紐づいています。

Data Intervalとは何か

AirflowのDAGで設定されるstart_dateとschedule_intervalの値によって決まる期間のことを指します。start_dateを2021-12-05、schedule_intervalに@dailyに設定した場合、各Data Intervalはある日の0時からその翌日の0時に達するまでの間になり、最初のData Interval はstart_dateに設定されている2021-12-05 00:00:00〜2021-12-06 00:00:00になります(図1)。この例の設定をしたサンプルコードをコード1に示します。

画像1

図1 Data Intervalの例

from datetime import datetime

from airflow import DAG
from airflow.operators.dummy import DummyOperator


default_args = {
   "owner": "example",
}

with DAG(
   dag_id=”example_execution_date”,
   default_args=default_args,
   schedule_interval="@daily",
   start_date=datetime(2021, 12, 5),
   catchup=False,
) as dag:
   t1 = DummyOperator(task_id="task1")

コード1

DAGの実行は通常関連するData Intervalが終了した後にスケジュールされ、その実行が期間内のデータを収集できることを保証しています(図2)。

画像6

図2 現在が12/09のときの処理対象のData Interval

​1. start_date

start_dateとは何か

Data Intervalの説明のときにも出てきましたが、DAGのスケジュール実行の対象となる最初のData Intervalの開始日になります。

start_dateをdatetime.now()とすることが良くない理由

Airflow FAQにはstart_dateに動的な値、特にdatetime.now()にしない方が良いと書かれていますがこれはなぜでしょうか。DAGの初回実行は最初のData Interval (start_date + schedule_interval)が過ぎたあとに実行されるので、start_dateが常に現在時刻に更新されれば現在時刻が start_date + schedule_intervalを満たすことはないのでDAGが永遠に実行されなくなります。図3ではstart_dateを現在( datetime.now() )、schedule_intervalを@dailyで設定したときのData Intervalを示しています。

画像6

図3 start_date=datetime.now()としたときのData Interval

2. execution_date ( ~ Airflow 2.1) / logical date (Airflow 2.2 ~)

execution_date / logical date とは何か

処理される対象のData Intervalの開始日を表します。この日付がややこしい点は主に2つ挙げられるのかなと思います。

・上記の通りスケジュール実行ではDAGが実行された日時が入るわけではない(旧名execution_dateから想定されうる値と実態が異なる)
・手動実行とスケジュール実行では入る値が異なる

この2点についてschedule_intervalを@dailyに設定した上記DAG(コード1)を2021-12-09に手動実行、スケジュール実行させた結果を見てみます(図4)。

・手動実行
execution_dateには実行日の2021-12-09が入っておりDAGを実行した日が入ることがわかります(図4青枠)。

・スケジュール実行
現在が2021-12-09でスケジュール実行されたとき、execution_dateには2021-12-08が入っておりDAGが実行された日でなく前日が入っていることがわかります(図4赤枠)。

画像6

図4 コード1を手動実行、スケジュール実行したDAG Runの一覧

execution_dateは処理対象のData Intervalの開始日になるので、対象のData Intervalが2021-12-08から2021-12-09であればexecution_dateは2021-12-08になります(図5)。最初のData Interval (処理対象のData Intervalの開始日がstart_dateに設定された値)を処理する場合はexecution_dateはstart_dateと同一になります。

画像6

図5 Data Intervalとexecution_date

※ AirflowのUI上ではホーム画面、各DAGのLast RunやNext Runの横にあるエクスクラメーションマークにマウスオーバーすると処理対象のData Intervalが表示されます(図6)。

スクリーンショット 2021-12-09 17.00.12

図6 Airflow UI上のData Intervalの表示

まとめると
・手動実行:Data Intervalに基づいて実行されないのでexecution_dateがデータ区間の開始日ではなく実行された日が入る
・スケジュール実行:処理対象のData Intervalの開始日が入る
ということでした。Airflow FAQではデータ区間の開始日もしくは終了日を使いたい場合は、data_interval_start、data_interval_endを使うことが推奨されていました。

おわりに

Airflowが扱う日付のうち, FAQに挙がっていたstart_date, execution_date (logcal date) をData Intervalの概念を交え説明してみました。Airflowの日付は何かとData Intervalと紐づいているので知っておくと良いと思います。お読みいただきありがとうございました、Airflowを使い始めた方などの助けになれば幸いです。

参考
1. Airflow FAQ
2. What's new in Apache Airflow 2.2.0
3. Scheduling and Timetables in Airflow

みんなにも読んでほしいですか?

オススメした記事はフォロワーのタイムラインに表示されます!