我有一个数据库表,看起来像:
name last_successful
dataset1 2020-11-07 10:30
dataset2 2020-11-07 10:30
现在,我想在气流中安排一个工作流程,该工作流程将执行以下操作:
name
和last_successful
。last_successful + 30 min
相对应的数据是否完整(假设这是一个黑匣子)last_successful
。由于数据集彼此独立,因此可以为每个数据集并行执行步骤2 + 3。如何在Airflow中做到这一点?我不想为每个数据集创建单独的任务,因为数据集的列表会不断增加。
答案 0 :(得分:1)
总结对评论的讨论。
创建DAG(作为其解析从DB读取记录的一部分)是一种不好的做法。 Airflow会不断解析文件,并将打开与数据库的连接以获取最新记录。这意味着数据库上的连接负载很大。 因此,Airflow将为尝试使用此方法的用户添加警告(请参阅issue)。当警告在Airflow Metastore后端上时,同样适用于任何其他数据库。
您可以通过在文件中列出数据集名称来处理用例。如果要使用动态任务创建DAG,则可以为文件中的任何新条目打开一个“分支”。然后,您可以在专门的运算符中将该条目与您的数据库进行比较,以确保该条目是有效的。
方法可能类似于:
def get_file():
with open('your_file') as f:
lines = f.read().splitlines()
return lines
file_list = get_file()
with DAG(dag_id='my_dag',...
) as dag:
start_op = DummyOperator(task_id='start_task')
for dataset in file_list:
my_op = MyOperator(task_id=dataset)
start_op >> my_op
这样,每次您将新数据集添加到文件时,它将使用MyOperator
自动为它添加分支