web-dev-qa-db-ja.com

気流バックフィルの説明

Airbnbの airflow を使い始めたばかりですが、バックフィルがどのように/いつ行われるかについてはまだわかりません。

特に、私を混乱させる2つのユースケースがあります。

  1. airflow schedulerを数分間実行し、1分間停止してから再起動すると、DAGが最初の30秒間ほど余分なタスクを実行しているように見え、その後は通常どおり続行します(10秒ごとに実行) 。これらの追加のタスクは、以前の実行では完了できなかった「バックフィルされた」タスクですか?もしそうなら、それらのタスクを埋め戻さないように気流にどのように伝えますか?

  2. airflow schedulerを数分間実行してからairflow clear MY_tutorialを実行し、airflow schedulerを再起動すると、追加のタスクが大量に実行されるようです。これらのタスクも何らかの形で「埋め戻された」タスクですか?または私は何かが欠けています。

現在、私は非常に簡単なdagを持っています:

default_args = {
    'owner': 'me',
    'depends_on_past': False,
    'start_date': datetime(2016, 10, 4),
    'email': ['[email protected]'],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
    # 'queue': 'bash_queue',
    # 'pool': 'backfill',
    # 'priority_weight': 10,
    # 'end_date': datetime(2016, 1, 1),
}

dag = DAG(
    'MY_tutorial', default_args=default_args, schedule_interval=timedelta(seconds=10))

# t1, t2 and t3 are examples of tasks created by instantiating operators
t1 = BashOperator(
    task_id='print_date',
    bash_command='date',
    dag=dag)

t2 = BashOperator(
    task_id='sleep',
    bash_command='sleep 5',
    retries=3,
    dag=dag)

templated_command = """
    {% for i in range(5) %}
        echo "{{ ds }}"
        echo "{{ macros.ds_add(ds, 8)}}"
        echo "{{ params.my_param }}"
    {% endfor %}
"""

t3 = BashOperator(
    task_id='templated',
    bash_command=templated_command,
    params={'my_param': 'Parameter I passed in'},
    dag=dag)

second_template = """
    touch ~/airflow/logs/test
    echo $(date) >> ~/airflow/logs/test
"""

t4 = BashOperator(
    task_id='write_test',
    bash_command=second_template,
    dag=dag)

t1.set_upstream(t4)
t2.set_upstream(t1)
t3.set_upstream(t1)

気流設定で変更したのは、次の2つだけです。

  1. Sqlite dbの使用からpostgres dbの使用に変更しました
  2. CeleryExecutorの代わりにSequentialExecutorを使用しています

あなたが助けてくれてありがとう!

27
diego_c

DAGのスケジューラトグルを「オン」に変更すると、スケジューラは、「default_args」で指定したstart_dateで始まる、ステータスが記録されていないすべてのDAG実行インスタンスのバックフィルをトリガーします。

例:開始日が「2017-01-21」で、「2017-01-22T00:00:00」でスケジュール切り替えをオンにし、DAGが1時間ごとに実行されるように構成されている場合、スケジューラーは24 DAGをバックフィルします実行し、スケジュールされた間隔で実行を開始します。

これは本質的にあなたの質問の両方で起こっていることです。 #1では、スケジューラーをオフにした30秒から3つの欠落した実行を埋めています。 #2では、start_dateから「現在」までのすべてのDAG実行を埋めています。

これには2つの方法があります。

  1. Start_dateを将来の日付に設定すると、その日付に達した後にのみダグ実行のスケジューリングが開始されます。 DAGのstart_dateを変更する場合、エアフローのDBに開始日が保存される方法のため、DAGの名前も変更する必要があることに注意してください。
  2. DBで実際にDAGを成功としてマークするのではなく、気流にDAGを実行しないよう指示する「-m」フラグを使用して、コマンドラインから手動でバックフィルを実行します( https://airflow.incubator .Apache.org/cli.html )。

    例えばairflow backfill MY_tutorial -m -s 2016-10-04 -e 2017-01-22T14:28:30

47
bricca

バージョン1.8以降、Airflowではキャッチアップを使用してこの動作を制御できることに注意してください。 airflow.cfgでcatchup_by_default=Falseを設定するか、DAG定義でcatchup=Falseを設定します。

https://airflow.Apache.org/scheduler.html#backfill-and-catchup を参照してください

10
adaris

AirflowのUIのオン/オフには「一時停止」のみが表示されます。つまり、オンの場合、トリガーされた時間で一時停止し、オフになった場合はその日付で再び続行します。

0
SMDC