气流中任务的粒度

2024-02-11

对于一项任务,有许多辅助任务 - 从文件/数据库获取/保存属性、验证、审核。这些辅助方法并不耗时。

一个样本 DAG 流,

fetch_data >> actual_processing >> validation >> save_data >> audit

这种情况下的建议是什么:

  • 为每个辅助任务创建一个任务
  • 将所有内容都放在一项任务中?

假设有足够的资源,气流任务的开销是多少?


问题1

这个场景有什么推荐

始终尝试在单个任务中保留最多的东西(最好有fat运行时间超过几分钟的任务lean运行几秒钟的任务)到(并非详尽列表)

  • 1.最小化调度延迟 https://stackoverflow.com/questions/63950467/how-can-one-create-somewhat-complex-airflow-branch-operators#comment113093795_63950467

  • 2.最小化负载scheduler / webserver / SQLAlchemy后端数据库。


此规则的例外情况可能是(并非详尽列表)

  • 1. when 幂等性规定您必须将任务分解为更小的步骤,以防止浪费的重新计算/破坏工作流程,如使用运算符 https://airflow.apache.org/docs/stable/howto/operator/index.html doc

一个操作符代表一个单一的、理想情况下幂等的任务

  • 2.特殊情况,例如您正在使用pools https://airflow.apache.org/docs/stable/concepts.html#pools限制外部资源的负载 => 在这种情况下,每个涉及外部资源的操作都必须建模为单独的任务,以便通过以下方式强制执行负载限制pools

问题2

假设有足够的资源,气流任务的开销是多少?

虽然我无法在这里提供技术上精确的答案,但请理解 Airflow 的调度程序本质上是在基于民意调查的方法

  • at every heartbeat (usually ~ 20-30 s), it scans meta-db and DagBag to determine the list of tasks that are ready to run for e.g. like
    • a scheduled上游任务已运行的任务
    • an up_for_retry任务是谁retry_delay已过期

来自old docs https://airflow.apache.org/docs/1.10.1/scheduler.html#:%7E:text=The%20Airflow%20scheduler%20monitors%20all,whether%20they%20can%20be%20triggered.

Airflow调度器监控所有任务和所有DAG,并触发 其依赖关系已得到满足的任务实例。在...后面 场景,它监视并与所有 DAG 的文件夹保持同步 它可能包含的对象,并定期(每分钟左右)检查 活动任务以查看它们是否可以被触发。

  • 这意味着拥有更多tasks(以及更多连接 / 依赖关系它们之间)会增加调度程序的工作量(需要评估更多检查)

建议阅读

  • Airflow Scheduler 调度后续任务的速度很慢 https://stackoverflow.com/q/47450855/3679900
  • 当气流不够快时 https://medium.com/@manuelmourato25/when-airflow-isnt-fast-enough-distributed-orchestration-of-multiple-small-workloads-with-celery-afb3daebe611
  • 使用 Airflow 执行频繁任务 https://stackoverflow.com/a/49676127/3679900

对于运行大量快速/小型任务的所有这些问题 ,我们需要快速的分布式任务管理,这不需要 先前的资源分配(如 Airflow 所做的那样),因为每个 ETL 任务都需要 资源非常少,并且允许任务在执行完之后执行 其他立即。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

气流中任务的粒度 的相关文章

随机推荐