到目前为止,我正在努力熟悉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'
)
答案 0 :(得分:2)
认为我找到了一个似乎对我有用的答案/方法(我上面的问题是没有独特的任务ID)。
在示例中有一篇小博客文章,以防其他人使用。
http://engineering.pmc.com/2017/03/playing-around-with-apache-airflow-bigquery-62/
答案 1 :(得分:1)
使用trigger_dag概念。它适用于此类用例。其中,您将参数传递给控制器dag中的子标记。您将在气流安装的示例文件夹中找到示例。