web-dev-qa-db-ja.com

ApacheAirflowスケジューラーはスケジュール時にDAGをトリガーしません

毎日特定の時間にDAGを実行するようにスケジュールすると、DAGの実行はまったく行われません。ただし、Airflow Webサーバーとスケジューラを再起動すると、DAGはその特定の日のスケジュールされた時間に1回実行され、翌日以降は実行されません。 python 2.7.6でAirflowバージョンv1.7.1.3を使用しています。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)

私は何か間違ったことをしていますか?

6
Prabhjot

あなたの問題は、現在の時刻に設定されている_start_date_です。 Airflowは、開始ではなく、間隔のendでジョブを実行します。これは、ジョブの最初の実行が最初の間隔の後に行われることを意味します。

例:

掘り下げて、真夜中に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では、ジョブを再実行したりバックフィルしたりする(またはダグを終了する)必要がある場合に備えて、静的なstart_datesを使用することをお勧めします。

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

18
apathyman

スケジュールから、DAGは毎日午前2時3分に実行されます。私の疑いは、start_dateがそれに影響を与えているのではないかということです。 'start_date'のようなものにハードコーディングできますか:datetime.datetime(2016、11、01)そして試してみてください。

1
kvb