【问题标题】:Efficient ways of implementing waiting till a certain criterion is met in Airflow在 Airflow 中实现等待直到满足某个标准的有效方法
【发布时间】:2018-02-09 08:02:33
【问题描述】:

Sensors in Airflow - 是一种特定类型的运算符,将继续运行直到满足特定条件,但它们会占用一个完整的工作槽。好奇人们是否能够可靠地使用更有效的方法来实现这一点。

我的一些想法

  • 使用池来限制分配给传感器的工作槽数量
  • 跳过所有下游任务,然后通过外部触发器清除并恢复
  • 暂停 DAG 的运行并通过外部触发器再次恢复

其他相关链接:

【问题讨论】:

  • 您有具体问题吗?其他问题的链接是相关的,应该可以帮助您了解此机制。
  • 传感器链接现已损坏

标签: python airflow airflow-scheduler


【解决方案1】:

Airflow 的新版本,即 1.10.2 为传感器提供了新的选项,我认为这解决了您的担忧:

mode (str) – 传感器如何工作。选项是:{戳|重新安排},默认是戳。当设置为 poke 时,传感器在其整个执行时间内占用一个工作槽,并在 poke 之间休眠。如果传感器的预期运行时间很短或需要较短的戳间隔,请使用此模式。当设置为重新安排时,传感器任务会在尚未满足条件并在稍后重新安排时释放工作槽。如果满足条件的预期时间是,请使用此模式。 poke 间隔应超过一分钟,以防止调度程序负载过多。

这里是link 到文档。

【讨论】:

    【解决方案2】:

    我认为您需要退后一步,质疑为什么传感器会占用一个完整的工作槽。

    Airflow 是一个调度器,而不是一个资源分配器。使用工作并发、池和队列,您可以限制资源使用,但只能非常粗略。最后,Airflow 天真地假设传感器将在工作节点上使用与产生多进程基因组测序实用程序的 BashOperator 相同的资源。但是传感器很便宜,而且 99.9% 的时间都在休眠,所以这是一个糟糕的假设。

    因此,如果您想解决传感器占用所有工作槽的问题,只需提高工作器的并发性即可。您应该能够让数百个传感器同时在单个工作器上运行。

    如果您在集群节点和系统负载高得危险的节点上遇到工作负载分布非常不均匀的问题,您可以使用以下任一方法来限制昂贵作业的数量:

    • 昂贵的作业必须消耗的池(将启动作业并等待池资源可用)。这会造成集群范围的限制。
    • 每个节点上的特殊工作人员只承担昂贵的工作(使用airflow worker --queues my_expensive_queue)并且具有低并发设置。这会创建每个节点的限制。

    如果您有比这更复杂的要求,请考虑将所有重要的计算作业发送到专用资源分配器,例如Apache Mesos,您可以在其中指定确切的 CPU、内存和其他要求,以确保您的集群负载在每个节点上的分布比 Airflow 能够做到的更有效。

    【讨论】:

      【解决方案3】:

      根据doc,跨 DAG 依赖是可行的

      可以在单独的 DAG 中将条件指定为单独的任务,以便在给定日期满足该条件时,允许运行子任务。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-27
        • 1970-01-01
        • 1970-01-01
        • 2012-01-10
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        相关资源
        最近更新 更多