【问题标题】:Airflow versus AWS Step Functions for workflow用于工作流的 Airflow 与 AWS Step Functions
【发布时间】:2020-09-22 19:58:28
【问题描述】:

我正在从事一个项目,该项目从 AWS S3 获取一组输入数据,对其进行预处理和分割,启动 10K 批处理容器以在 AWS Batch 上并行处理分割数据,对数据进行后聚合,并将其推送到 S3。

我已经有来自其他项目的 Airflow + Batch 软件模式,但还没有处理 10k 并行任务的缩放因子。气流很好,因为我可以查看哪些任务失败并在调试后重试任务。但是在一个 Airflow EC2 实例上处理这么多任务似乎是一个障碍。另一种选择是让一个任务启动 10k 容器并从那里监视它。

我没有使用 Step Functions 的经验,但听说它是 AWS 的 Airflow。 Step Functions + Batch 在线看起来有很多模式。 Step Functions 似乎是检查我的用例的好方法吗?对于失败的作业/重试任务的能力,您是否获得与 Airflow 相同的见解?

【问题讨论】:

  • 我对 Airflow 的轶事经验表明,10k 并发任务只会扼杀scheduler(实际上 2-3k 并发任务就足够了);但在此之前,您会开始对相对较慢的flask 前端感到恼火(它不会自动刷新 的东西)。从未探索过 AWS Step Functions,但可以在 Airflow 上给您 2 美分[1] 不要创建单一的 DAG(包含数百个任务):尝试将 DAG 保持在 scheduler 增加额外的工作
  • [2] 设计您的工作流程(任务/操作员)以将 Airflow 用作纯编排器:任务应委派繁重的工作(实际处理)到外部系统(不同于一台气流/它的工作人员正在运行的机器)。这样,您将能够独立于它触发的各种任务来扩展您的 Airflow 部署[3]将您的 DAG(以及其中的单个任务)保持为 immutable跨度>
  • 我觉得 Airflow 不能运行这么多并发的事情的主要原因是因为scheduler 本质上是在 polling 上工作的(定期检查哪些任务可以运行,然后运行它们)
  • 查看 Netflix 使用 AWS Step Functions 的 MetaFlow
  • @sanjayr 看起来像是对协调器的滥用。将处理拆分为子任务应该是处理框架的责任。例如,Airflow 触发一项作业,而 Spark on Glue 或 EMR 在后台将数据拆分为任务,您应该只关心应用程序逻辑

标签: airflow aws-step-functions


【解决方案1】:

我曾研究过 Apache Airflow 和 AWS Step Functions,以下是一些见解:

  • Step Functions 提供开箱即用的维护。它具有您的用例所需的高可用性和可扩展性,对于 Airflow,我们必须通过服务器或容器 (kubernetes) 上的自动扩展/负载平衡来实现它。*
  • Airflow 和 Step Functions 都具有用户友好的 UI。尽管 Airflow 支持状态机的多种表示形式,但 Step Functions 仅将状态机显示为 DAG。
  • 从 2.0 版开始,Airflow 的 Rest API 现在是 stable。一系列生产分级 cli 和 SDK's 也支持 AWS Step Functions。
  • Airflow 有服务器成本,而 Step Functions 有 4000 次/月的免费步骤执行(免费套餐),之后为 0.000025 美元/步骤。例如如果您对每天运行一次的 AWS Batch 使用 10K 步,您的价格将是每天 0.25 美元(每月 7.5 美元)。 Airflow 服务器(t2.large ec2 1 年预留实例)的价格为每月 41.98 美元。无论哪种情况,我们都必须使用 AWS Batch。**
  • AWS Batch 可以集成到AirflowStep Functions
  • 您可以在 Apache Airflow 中清除并重新运行失败的任务,但在 Step Functions 中,您必须创建一个 custom implementation 来处理它。您也可以在 Step Functions 定义中处理 automated retries with back-offs
  • 对于 Step Functions 中的失败任务,当您单击它时,您将获得失败状态的可视化表示和详细消息。您也可以使用 aws cli 或 sdk 来获取详细信息。
  • Step Functions 使用易于使用的 JSON 作为状态机定义,而 Airflow 使用 Python 脚本。
  • Step Functions 支持async callbacks,即状态机暂停,直到外部源通知它恢复。虽然 Airflow 有 yet to add 这个功能。

总的来说,我看到了使用 AWS Step Functions 的更多优势。您必须根据您的用例考虑这两种服务的维护成本和开发成本。

更新(适用于 Apache Airflow 服务的 AWS 托管工作流):

  • *借助适用于 Apache Airflow 服务的 AWS Managed Workflows,您可以将 Airflow 服务的部署、维护、自动缩放/负载平衡和安全性转移到 AWS。但请考虑您愿意接受的版本号,因为 AWS 托管服务大多落后于最新版本。 (例如,截至 2021 年 3 月 8 日,最新版本的开源气流是 2.01,而 MWAA 允许版本 1.10.12)
  • **MWAA 环境、实例和存储成本。 More details here

【讨论】:

  • 这对 AWS 管理的 Airflow 仍然有效吗...?如果没有,让我们在这里更新答案
  • @NathanBenton 感谢您的指点,很快就会更新。
  • @amsh 如果我有 5 个 sql 查询并且我想创建 5 个 Dag,以便我可以触发 5 个 diff SQL 操作并检查它们是否失败,以便我可以再次触发那个特定的 DAG。我可以为每个 DAG 设置和发送电子邮件通知吗?我也可以为每个 DAG 设置重试。我可以在步骤功能中实现相同的功能吗?我记得如果我为 sql 查询创建一个 DAG,那么如果一个失败,那么我必须再次重新启动整个 DAG。这就是为什么我想为每个 sql 查询创建多个 DAG,如果一个失败,它会在继续下一个之前重试。请指导
  • 在 dag 失败的情况下查看“重试”参数
猜你喜欢
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 2022-01-11
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
  • 2020-01-29
相关资源
最近更新 更多