在Airflow中循环参数的最佳方法是什么?

时间:2017-03-21 14:38:55

标签: apache google-bigquery airflow

到目前为止,我正在努力熟悉Airflow并热爱它。

然而,我有点不清楚的一件事是如何正确地重新定义我的dag,我想要运行相同的dag但并行多行业务(lob)。所以基本上我想在每次运行中运行下面的dag以获得多个吊球,并且每个吊杆都以parralel运行。

所以我要说我定义了一个变量,它是一个像“lob1”,“lob2”等lob数组。我想用'lob1'然后'lob2'等替换下面的bigquery sql语句中的'mylob'

我想也许我可以将lobs作为变量存储在ui中,然后在dag中循环,但我不确定这是否最终会顺序,因为它等待每个任务完成每个循环迭代。

我认为另一种方法可能是使用这种paramaterised dag作为一个更大的驱动器dag中的子dag。但同样不确定这是否是最佳实践方法。

任何帮助或指示非常感谢。我觉得我在这里遗漏了一些明显的东西,但我并没有在任何地方找到这样的例子。

"""
### My first dag to play around with bigquery and gcp stuff.
"""

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta
from dateutil import tz
from airflow.contrib.hooks.bigquery_hook import BigQueryHook
from airflow.contrib.operators.bigquery_operator import BigQueryOperator

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2017, 3, 10),    
    'email': ['xxx@xxx.com'],
    'email_on_failure': True,
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
    # 'queue': 'bash_queue',
    # 'pool': 'backfill',
    # 'priority_weight': 10,
    # 'end_date': datetime(2016, 1, 1),
}

with DAG('my_bq_dag_2', schedule_interval='30 */1 * * *',
         default_args=default_args) as dag:

    bq_msg_1 = BigQueryOperator(
        task_id='my_bq_task_1',
        bql='select "mylob" as lob, "Hello World!" as msg',
        destination_dataset_table='airflow.test1',
        write_disposition='WRITE_TRUNCATE',
        bigquery_conn_id='gcp_smoke'
    )

    bq_msg_1.doc_md = """\
    #### Task Documentation
    Append a "Hello World!" message string to the table [airflow.msg]
    """

    bq_msg_2 = BigQueryOperator(
        task_id='my_bq_task_2',
        bql='select "mylob" as lob, "Goodbye World!" as msg',
        destination_dataset_table='airflow.test1',
        write_disposition='WRITE_APPEND',
        bigquery_conn_id='gcp_smoke'
    )

    bq_msg_2.doc_md = """\
    #### Task Documentation
    Append a "Goodbye World!" message string to the table [airflow.msg]
    """

    # set dependencies
    bq_msg_2.set_upstream(bq_msg_1)

更新:尝试让这个工作正常但它似乎永远不会成为第2个

"""
### My first dag to play around with bigquery and gcp stuff.
"""

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta
from airflow.contrib.operators.bigquery_operator import BigQueryOperator

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2017, 3, 10),    
    'email': ['xxx@xxx.com'],
    'email_on_failure': True,
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
}

dag = DAG('my_bq_dag_2', schedule_interval='@once',default_args=default_args)

lobs = ["lob1","lob2","lob3"]

for lob in lobs:

    templated_command = """
        select '{{ params.lob }}' as lob, concat(string(current_timestamp()),' - Hello - {{ ds }}') as msg
    """    

    bq_msg_1 = BigQueryOperator(
        dag = dag,
        task_id='my_bq_task_1',
        bql=templated_command,
        params={'lob': lob},
        destination_dataset_table='airflow.test1',
        write_disposition='WRITE_APPEND',
        bigquery_conn_id='gcp_smoke'
    )

2 个答案:

答案 0 :(得分:2)

认为我找到了一个似乎对我有用的答案/方法(我上面的问题是没有独特的任务ID)。

在示例中有一篇小博客文章,以防其他人使用。

http://engineering.pmc.com/2017/03/playing-around-with-apache-airflow-bigquery-62/

答案 1 :(得分:1)

使用trigger_dag概念。它适用于此类用例。其中,您将参数传递给控制器​​dag中的子标记。您将在气流安装的示例文件夹中找到示例。