Airbnbの airflow を使い始めたばかりですが、バックフィルがどのように/いつ行われるかについてはまだわかりません。
特に、私を混乱させる2つのユースケースがあります。
airflow scheduler
を数分間実行し、1分間停止してから再起動すると、DAGが最初の30秒間ほど余分なタスクを実行しているように見え、その後は通常どおり続行します(10秒ごとに実行) 。これらの追加のタスクは、以前の実行では完了できなかった「バックフィルされた」タスクですか?もしそうなら、それらのタスクを埋め戻さないように気流にどのように伝えますか?
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つだけです。
CeleryExecutor
の代わりにSequentialExecutor
を使用していますあなたが助けてくれてありがとう!
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つの方法があります。
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
バージョン1.8以降、Airflowではキャッチアップを使用してこの動作を制御できることに注意してください。 airflow.cfgでcatchup_by_default=False
を設定するか、DAG定義でcatchup=False
を設定します。
https://airflow.Apache.org/scheduler.html#backfill-and-catchup を参照してください
AirflowのUIのオン/オフには「一時停止」のみが表示されます。つまり、オンの場合、トリガーされた時間で一時停止し、オフになった場合はその日付で再び続行します。