如何并行化Airflow DAG中的类似BashOperator任务但参数不同

时间:2019-04-04 20:10:21

标签: apache airflow

我在DAG中并行执行以下2个任务 在现实世界中,这些任务可能是15或20个任务,其输入参数来自数组,如下所示。

fruits = ["apples", "bananas"]

bad_dag = DAG('bad_dag_3', default_args=default_args, schedule_interval=None)

t0=BashOperator(
    task_id="print",
    bash_command='echo "Beginning parallel tasks next..." ',
    dag=bad_dag)

t1=BashOperator(
    task_id="fruit_"+fruits[0],
    params={"fruits": fruits}, 
    bash_command='echo fruit= {{params.fruits[0]}} ',
    dag=bad_dag)

t2=BashOperator(
    task_id="fruit_"+fruits[1],
    params={"fruits": fruits},
    bash_command='echo fruit= {{params.fruits[1]}} ',
    dag=bad_dag)

t0>>[t1, t2]

对我来说,编写此DAG的最佳方法是什么,所以我不必像上面一样重复一遍又一遍地重写同一BashOperator。

我不能使用循环,因为如果使用循环,则无法并行化任务。

1 个答案:

答案 0 :(得分:0)

使用以下DAG。想法是,每个任务的task_id应该是唯一的,其余部分将由气流处理。

fruits = ["apples", "bananas"]

bad_dag = DAG('bad_dag_3', default_args=default_args, schedule_interval=None)

t0=BashOperator(
    task_id="print",
    bash_command='echo "Beginning parallel tasks next..." ',
    dag=bad_dag)

for fruit in fruits:
    task_t = BashOperator(
        task_id="fruit_"+fruit,
        params={"fruit": fruit},
        bash_command='echo fruit= {{params.fruit}} ',
        dag=bad_dag)

    t0 >> task_t