web-dev-qa-db-ja.com

エアフローのスケジュールを正しく機能させる方法

Cronの代わりにAirflowを使用したいと思います。しかし、schedule_intervalは期待どおりに機能しません。

私はpythonコードを以下のように書きました。
そして私の理解では、Airflowは「2016/03/30 8:15:00」で実行されているはずですが、その時点では機能しませんでした。

「 'schedule_interval':timedelta(minutes = 5)」のように変更すると、正しく機能したと思います。

「notice_slack.sh」は、私のチャンネルに対してSlack APIを呼び出すだけです。

# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import os
from airflow.operators import BashOperator
from airflow.models import DAG
from datetime import datetime, timedelta

args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2016, 3, 29, 8, 15),
}

dag = DAG(
    dag_id='notice_slack',
    default_args=args,
    schedule_interval="@daily",
    dagrun_timeout=timedelta(minutes=1))

# cmd file name
CMD = '/tmp/notice_slack.sh'

run_this = BashOperator(
    task_id='run_transport', bash_command=CMD, dag=dag)

このcron設定のように、スクリプトの一部を毎日特定の時間に実行したい。

15 08 * * * bash /tmp/notice_slack.sh

私はドキュメント Scheduling&Triggers を読みましたが、それは少し異なるcronであることを知っています。
そこで、「start_date」と「schedule_interval」の設定を調整しようとしています。

誰か私が何をすべきか知っていますか?

気流バージョン

情報-executor LocalExecutorの使用

v1.7.0

Amazon-linux-AMI/2015.09-release-notes

10
k16

2016/03/30 8:15:00 +スケジュール間隔(毎日)が経過すると、AirflowがDAGを開始します。したがって、DAGは2016/03/31 8:15:00に実行されます。

Airflow FAQ を確認できます

12
p.magalhaes

これを試して:

# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import os
from airflow.operators import BashOperator
from airflow.models import DAG
from datetime import datetime, timedelta

args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2016, 3, 29),
}

dag = DAG(
    dag_id='notice_slack',
    default_args=args,
    schedule_interval="15 08 * * *",
    dagrun_timeout=timedelta(minutes=1))

# cmd file name
CMD = 'bash /tmp/notice_slack.sh'

run_this = BashOperator(
    task_id='run_transport', bash_command=CMD, dag=dag)

start_date(datetime)–タスクのstart_dateは、最初のタスクインスタンスのexecution_dateを決定します。ベストプラクティスは、start_dateをDAGのschedule_intervalに丸めることです。

schedule_interval(crontime式として機能するdatetime.timedeltaまたはdateutil.relativedelta.relativedeltaまたはstr)– DAGが実行される頻度を定義します。このtimedeltaオブジェクトが最新のタスクインスタンスのexecution_dateに追加され、次のスケジュールを把握します。

単にschedule_intervalおよびbash_command cron設定と同じで問題ありません。

10
ansvver

airflow cron式の作成方法が本当にわからない場合は、 crontab.gur を使用してみてください。

_@daily_を指定した例では、深夜過ぎにジョブが実行されます。 08:15を含む固定_start_date_に関連するtimedelta(days=1)に変更してみてください。または、_schedule_interval='15 08 * * *'_のcron仕様を使用することもできます。その場合、最初の実行が機能する日の前日の8:15より前の開始日が機能します。

_depends_on_past: False_は既にデフォルトであり、DAGパラメーターの_catchup=false_とその動作を混同している可能性があることに注意してください。これにより、開始日とDAGスケジュール間隔の間の過去の実行が回避されます。実行しました。

0
dlamblin