web-dev-qa-db-ja.com

Airflowで条件付きタスクを作成する方法

以下のスキーマで説明するように、Airflowで条件付きタスクを作成したいと思います。予想されるシナリオは次のとおりです。

  • タスク1が実行されます
  • タスク1が成功したら、タスク2aを実行します
  • それ以外の場合、タスク1が失敗した場合は、タスク2bを実行します
  • 最後にタスク3を実行します

Conditional Task 上記のすべてのタスクはSSHExecuteOperatorです。 ShortCircuitOperatorやXComを使用して状態を管理する必要があると思いますが、それを実装する方法は明確ではありません。解決策を説明してください。

40
Alexis.Rolland

エアフロートリガールール を使用する必要があります

すべての演算子には、生成されたタスクをトリガーするルールを定義するtrigger_rule引数があります。

トリガールールの可能性:

ALL_SUCCESS = 'all_success'
ALL_FAILED = 'all_failed'
ALL_DONE = 'all_done'
ONE_SUCCESS = 'one_success'
ONE_FAILED = 'one_failed'
DUMMY = 'dummy'

問題を解決するためのアイデアは次のとおりです。

from airflow.operators.ssh_execute_operator import SSHExecuteOperator
from airflow.utils.trigger_rule import TriggerRule
from airflow.contrib.hooks import SSHHook

sshHook = SSHHook(conn_id=<YOUR CONNECTION ID FROM THE UI>)

task_1 = SSHExecuteOperator(
        task_id='task_1',
        bash_command=<YOUR COMMAND>,
        ssh_hook=sshHook,
        dag=dag)

task_2 = SSHExecuteOperator(
        task_id='conditional_task',
        bash_command=<YOUR COMMAND>,
        ssh_hook=sshHook,
        dag=dag)

task_2a = SSHExecuteOperator(
        task_id='task_2a',
        bash_command=<YOUR COMMAND>,
        trigger_rule=TriggerRule.ALL_SUCCESS,
        ssh_hook=sshHook,
        dag=dag)

task_2b = SSHExecuteOperator(
        task_id='task_2b',
        bash_command=<YOUR COMMAND>,
        trigger_rule=TriggerRule.ALL_FAILED,
        ssh_hook=sshHook,
        dag=dag)

task_3 = SSHExecuteOperator(
        task_id='task_3',
        bash_command=<YOUR COMMAND>,
        trigger_rule=TriggerRule.ONE_SUCCESS,
        ssh_hook=sshHook,
        dag=dag)


task_2.set_upstream(task_1)
task_2a.set_upstream(task_2)
task_2b.set_upstream(task_2)
task_3.set_upstream(task_2a)
task_3.set_upstream(task_2b)
36
Jean S

Airflowには BranchPythonOperator があり、これを使用して分岐依存関係をより直接表現できます。

docs はその使用法を説明しています:

BranchPythonOperatorは、task_idを返すpython_callableを想定していることを除いて、PythonOperatorとよく似ています。返されたtask_idが続き、他のすべてのパスはスキップされます。 Python関数によって返されるtask_idは、BranchPythonOperatorタスクのすぐ下流のタスクを参照する必要があります。

...

一部のタスクをスキップする場合は、空のパスを使用できないことに注意してください。空のパスがある場合は、ダミーのタスクを作成します。

コード例

def dummy_test():
    return 'branch_a'

A_task = DummyOperator(task_id='branch_a', dag=dag)
B_task = DummyOperator(task_id='branch_false', dag=dag)

branch_task = BranchPythonOperator(
    task_id='branching',
    python_callable=dummy_test,
    dag=dag,
)

branch_task >> A_task 
branch_task >> B_task

編集

Airflowバージョン> = 1.10.3をインストールする場合は、 タスクIDのリストを返す を使用することもできます。これにより、単一のオペレーターで複数のダウンストリームパスをスキップし、 しないでください)参加する前にダミータスクを使用してください

42
villasv