Apache Airflow スケジューラはスケジュール時間に DAG をトリガーしません 質問する

Apache Airflow スケジューラはスケジュール時間に DAG をトリガーしません 質問する

DAG を毎日特定の時間に実行するようにスケジュールすると、DAG はまったく実行されません。ただし、Airflow Web サーバーとスケジューラを再起動すると、DAG はその特定の日のスケジュールされた時間に 1 回実行され、翌日以降は実行されません。私は Airflow バージョン v1.7.1.3 と Python 2.7.6 を使用しています。DAG コードは次のとおりです。

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta

import time
n=time.strftime("%Y,%m,%d")
v=datetime.strptime(n,"%Y,%m,%d")
default_args = {
    'owner': 'airflow',
    'depends_on_past': True,
    'start_date': v,
    'email': ['[email protected]'],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=10),

}

dag = DAG('dag_user_answer_attempts', default_args=default_args, schedule_interval='03 02 * * *')

# t1, t2 and t3 are examples of tasks created by instantiating operators
t1 = BashOperator(
    task_id='user_answer_attempts',
    bash_command='python /home/ubuntu/bigcrons/appengine-flask-skeleton-master/useranswerattemptsgen.py',
    dag=dag)

何か間違ったことをしているのでしょうか?

ベストアンサー1

問題はstart_date現在の時刻に設定されていることです。Airflowはジョブを終わり間隔の開始ではなく終了です。つまり、ジョブの最初の実行は最初の間隔の後に行われます。

例:

DAG を作成し、深夜に Airflow でライブにします。今日 (20XX-01-01 00:00:00) も start_date ですが、ハードコードされています ( "start_date":datetime(20XX,1,1))。スケジュール間隔は、あなたの場合と同様に毎日です ( 3 2 * * *)。

このDAGが最初に実行のためにキューに入れられるのは20XX-01-02 02:03:00です。これは、間隔期間が終了その時点で実行されている dag を見ると、開始日時は schedule_date のおよそ 1 日後になっているはずです。

start_dateこれを解決するためには、日付をハードコードする必要があります。または動的な日付が実行間隔よりも過去に設定されていることを確認します (この場合、2 日あれば十分です)。Airflow では、ジョブを再実行したり、バックフィルしたり (または DAG を終了したり) する必要がある場合に備えて、静的な start_dates を使用することをお勧めします。

バックフィルの詳細については(この一般的な StackOverflow の質問の反対側)、ドキュメントまたはこの質問を確認してください。Airflow が正しくスケジュールされない Python

おすすめ記事