气流-任务内的并行执行

时间:2020-11-07 04:54:44

标签: python celery airflow

我有一个数据库表,看起来像:

name        last_successful
dataset1    2020-11-07 10:30
dataset2    2020-11-07 10:30

现在,我想在气流中安排一个工作流程,该工作流程将执行以下操作:

  1. 从数据库中读取所有数据集namelast_successful
  2. 对于每个数据集,检查与下一个30分钟存储桶last_successful + 30 min相对应的数据是否完整(假设这是一个黑匣子)
  3. 在s3数据分区中写一个_SUCCESS文件,该文件与在step2中找到的任何完成的存储桶相对应,并更新数据库中的last_successful

由于数据集彼此独立,因此可以为每个数据集并行执行步骤2 + 3。如何在Airflow中做到这一点?我不想为每个数据集创建单独的任务,因为数据集的列表会不断增加。

1 个答案:

答案 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自动为它添加分支