schedule_interval=Noneの場合、next_execution_timeはどうなる?
Airflowのデフォルト変数には next_execution_time
という、次の実行時の execution_time
が格納される変数があります。
これはDAGがスケジュール設定されている(schedule_intervalがNoneではない)ときに意味のある値なのですが、スケジュール設定されていない(schedule_intervalがNoneである)ときにどうなるか調べました。
確認したバージョン
- Airflow 1.10.9
確認手順
schedule_interval=NoneのDAGを作り、Airflowコンソール上から手動実行する。
結果1: schedule_interval=Noneの場合、next_execution_timeはexecution_timeと同じ値になる
スケジュール設定がない以上次の実行も何もないのでNoneが入るのかなと思いましたが、意外にも execution_time
と同じ値が入っていました。
結果2: schedule_interval=Noneの場合、prev_execution_timeはexecution_timeと同じ値になる
next_execution_time
の対になる prev_execution_time
(前回実行時の execution_time
が格納される変数)も気になって調べてみました。
その結果、こちらも execution_time
と同じ値が入っていました。
「2回目を実行したら1回目の execution_time
が入るかな?」と思い何度か繰り返しましたが、そんなことはなく結果は常に execution_time
と同じ値でした。
結論:schedule_interval=Noneの場合はnext_execution_time=prev_execution_time=execution_time
以上より、schedule_interval=Noneの場合は常にnext_execution_time=prev_execution_time=execution_timeになることがわかりました。
Noneではないのでis not Noneを期待したユーザーコードでエラーが出ることはありませんが、ちょっと気持ち悪さもありますね。
付録
確認コード
import airflow
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import timedelta
default_args = {
"owner": "airflow",
"depends_on_past": False,
"start_date": airflow.utils.dates.days_ago(1),
"retries": 1,
"retry_delay": timedelta(minutes=5),
}
dag = DAG(
"execution_date_test",
default_args=default_args,
catchup=False,
schedule_interval=None
)
templated_command = """
echo "execution_date={{ execution_date }}"
echo "next_execution_date={{ next_execution_date }}"
echo "prev_execution_date={{ prev_execution_date }}"
"""
t3 = BashOperator(
task_id="templated",
bash_command=templated_command,
dag=dag,
)
実行結果のログ
*** Log file does not exist: /usr/local/airflow/logs/execution_date_test/templated/2021-02-22T12:57:52.434900+00:00/1.log
(省略)
[2021-02-22 12:57:58,851] {{bash_operator.py:115}} INFO - Running command:
echo "execution_date=2021-02-22T12:57:52.434900+00:00"
echo "next_execution_date=2021-02-22T12:57:52.434900+00:00"
echo "prev_execution_date=2021-02-22T12:57:52.434900+00:00"
[2021-02-22 12:57:58,859] {{bash_operator.py:122}} INFO - Output:
[2021-02-22 12:57:58,860] {{bash_operator.py:126}} INFO - execution_date=2021-02-22T12:57:52.434900+00:00
[2021-02-22 12:57:58,860] {{bash_operator.py:126}} INFO - next_execution_date=2021-02-22T12:57:52.434900+00:00
[2021-02-22 12:57:58,860] {{bash_operator.py:126}} INFO - prev_execution_date=2021-02-22T12:57:52.434900+00:00
(省略)