Airflow 跨DAG的持久数据存储

Airflow 跨DAG的持久数据存储,airflow,Airflow,我有两个DAG,它们创建临时AWS EMR集群,然后在完成运行后终止它们。我想创建一个每天运行的新DAG,并生成当天创建的每个EMR集群的报告,以及它运行的时间,并通过电子邮件将此报告发送给不同的人 我需要存储EMR集群ID值,以便我的报告生成器具有当天每个EMR集群ID的列表。我想知道我是否可以修改气流变量来存储这些信息,例如,我可以有一个气流变量,其中键是“EMR_CLUSTERS”,值是一个JSON字符串,包含我想要记录的所有数据。或者我可以使用已经被用来写入新表的Airflow元数据库来

我有两个DAG,它们创建临时AWS EMR集群,然后在完成运行后终止它们。我想创建一个每天运行的新DAG,并生成当天创建的每个EMR集群的报告,以及它运行的时间,并通过电子邮件将此报告发送给不同的人

我需要存储EMR集群ID值,以便我的报告生成器具有当天每个EMR集群ID的列表。我想知道我是否可以修改气流变量来存储这些信息,例如,我可以有一个气流变量,其中键是“EMR_CLUSTERS”,值是一个JSON字符串,包含我想要记录的所有数据。或者我可以使用已经被用来写入新表的Airflow元数据库来写入这些信息吗


在Airflow中存储永久数据的选项有哪些?

您提到的任一选项都可以:

  • 气流变量
  • 元数据数据库
  • 第三个选项是网络存储。 如果您正在运行airflow distributed,那么您可能正在网络存储上存储DAG,并将其装载到workers/scheduler/webserver中。在这种情况下,在该存储上放置基于文件的报告(并可能通过电子邮件发送报告等)将是一个可靠的选择

    这将适用于这3种情况中的任何一种,并且它可以显示何时写入/发送的内容

    变量

    ,但在我看来,每天覆盖它有点草率

    MetadataDB

    用于创建和读取/写入存储此信息的表。 您可以通过执行以下操作在airflow元数据数据库上获取会话:

    来自气流导入设置的
    
    session=settings.session()
    
    网络存储


    在本例中,只需正常读取/写入文件。

    对于变量选项,其文档仅演示如何从变量读取,而不是从Python代码中写入变量。我知道如何使用CLI设置它们,比如
    气流变量--set key value
    ,但是是否可以从代码中设置它们(除了通过bash操作符发送上一个命令之外)?我正试图找到
    aiffort.models.Variables
    API文档,但找不到它。另外,我想知道在这类任务中使用MetaDB是否不好?我觉得基础设施和代码的混合可能会造成潜在的危险。例如,DevOps中的某个人可以为Airflow环境创建一个新的MetaDB,而没有意识到它也用于代码(idk只是我脑海中的一个例子)。我觉得像这样的东西应该有一个气流标准,或者用户可能会创建他们自己的数据库来存储这样的信息?我们使用大量气流,并使用元数据数据库为我们自己的插件。我们有一个自定义执行器作为插件的一部分,如果表不存在,它将创建这些表。如果有人杀死了整个数据库,那么插件数据可能不是最大的问题。我想到的第四个选项是将信息放入S3(因为您使用的是EMR,所以您可能有权访问S3)。我想到了S3选项,这是我倾向的选项。但是根据我对S3的理解,没有锁定机制,所以我想知道如果我的两个工作人员同时在S3中包含的JSON文件上记录他们的EMR集群详细信息,是否会有竞争条件。我会将其写入,以便每个作业都写入一个文件/文件夹,其中包含run_id。这将保持其唯一性,避免锁定。()难道不可能创建一个简单的DAG来查询AWS API并请求在特定时间创建的EMR集群,或者使用特定的标记?为您节省重新创建元数据存储的时间?