具有可变依赖性的用例的气流 dag 定义
definition of airflow dag for a use case with variable dependencies
我想将气流用于以下用例:
- 计算给定网站的每日报告(要处理约 150 个网站)。每个报告将按如下方式计算:
- 站点级别的一组任务运行,
- 一组应该在页面级别 运行 的任务,每个网站包含 ~ 10k 页。
- 执行上述两组任务后,第三组任务是运行汇总结果并生成报告。
注意:此处描述的每个 airflow 任务实际上都是对远程微服务的简单调用(grpc 调用)。
目前我想到的设计:
- 我最初想在一个任务中执行与页面相关的所有过程,以便有一个简单、定义明确的 dag,只有几个任务。
但是页面上需要做的处理比较复杂,有外部依赖和队列(只有收到外部系统的通知才会触发下一个任务,那些通知可能会在几个小时后到达)=>我想用airflow来处理这个过程。
- 鉴于上述观点,我现在倾向于一种模型,其中一个网站的所有进程都嵌入在一个 dag 中,包括页面的任务。理想情况下,我想为与页面相关的任务使用 subdag,但从我目前阅读的内容来看,此功能还不稳定。
每个网站都会生成一个新的 dag,带有一组新的任务(因为 dag 的结构取决于页面的数量)。
因此,每个 dag 的任务数将相对重要 (10k)。
我的问题:
- airflow 是这个用例的可接受框架吗(即你是否 运行 类似的用例)或替代框架,如 luigi、oozie ... 在这方面有明显的优势上下文 ?
- 上面的方法(每个网站一个 dag,没有 subdag,在 dag 中包含页面任务)是否合理?您是否预见到任何问题?
- Web ui 是否仍可用于该数量的任务?我用几百个任务做了一个 quick 测试,我有几次超时,我想知道它是否链接到我的配置。
- 芹菜是正确的后端吗?我想知道 "LocalExecutor" 是否真的更适合这个用例,因为事实上气流工作者没有直接执行计算(他们只调用远程服务)。
你最初的想法是我会同意的。拥有 150 个不同的工作流程,每个工作流程有 10K 个任务,这会导致一个完全动态且难以管理的场景。一方面你说每个任务只是一个简单的 gRPC 但同时你提到页面级任务真的很复杂以封装在单个任务后面并且存在外部依赖性可能导致以小时为单位的流量瓶颈。
如果我是你,我会重新设计解决方案并将页面级报告转移到不同的层。例如,创建一个可以执行所有这些复杂计算的服务将是比尝试在 Airflow 中实现它更好的选择。这样您可能会显着减少页面级任务的数量。
关于您的具体问题:
- Airflow 与大小写无关 - 每个场景都可以是完美的,具体取决于
设计。 Oozie 真的很老派,很笨重,没有太多的
Airfow 提供的集成功能。路易吉我没用过
- 如前所述,这种方法既不可预测又难以管理。我预见到混乱:)
- 挂起 UI 是一个很好的指标,表明您应该重新审视您的实施设计。但是 UI 应该是您的第一要务 - 您如何在单个工作流中监控和管理 10,000 个任务?正确 - 你不能。并将其乘以 150。
- 我不久前从一家公司读到一篇文章,他们在使用 Celery 进行横向扩展时遇到了问题,他们决定改为纵向扩展,运行 许多调度程序进程在同一个 VM 上并行处理。不太确定这是否是一个对您的方案有很大帮助的设置。
如果我是你,我会为所有 150 个站点使用一个工作流程。我会为每个网站创建一个 subdag(顺便说一句,official docs 中没有提到 'unstable' 这个词)并尝试将复杂的计算操作卸载到不同的层以减少数量尽可能多的页面级任务。
我想将气流用于以下用例:
- 计算给定网站的每日报告(要处理约 150 个网站)。每个报告将按如下方式计算:
- 站点级别的一组任务运行,
- 一组应该在页面级别 运行 的任务,每个网站包含 ~ 10k 页。
- 执行上述两组任务后,第三组任务是运行汇总结果并生成报告。
注意:此处描述的每个 airflow 任务实际上都是对远程微服务的简单调用(grpc 调用)。
目前我想到的设计:
- 我最初想在一个任务中执行与页面相关的所有过程,以便有一个简单、定义明确的 dag,只有几个任务。 但是页面上需要做的处理比较复杂,有外部依赖和队列(只有收到外部系统的通知才会触发下一个任务,那些通知可能会在几个小时后到达)=>我想用airflow来处理这个过程。
- 鉴于上述观点,我现在倾向于一种模型,其中一个网站的所有进程都嵌入在一个 dag 中,包括页面的任务。理想情况下,我想为与页面相关的任务使用 subdag,但从我目前阅读的内容来看,此功能还不稳定。 每个网站都会生成一个新的 dag,带有一组新的任务(因为 dag 的结构取决于页面的数量)。 因此,每个 dag 的任务数将相对重要 (10k)。
我的问题:
- airflow 是这个用例的可接受框架吗(即你是否 运行 类似的用例)或替代框架,如 luigi、oozie ... 在这方面有明显的优势上下文 ?
- 上面的方法(每个网站一个 dag,没有 subdag,在 dag 中包含页面任务)是否合理?您是否预见到任何问题?
- Web ui 是否仍可用于该数量的任务?我用几百个任务做了一个 quick 测试,我有几次超时,我想知道它是否链接到我的配置。
- 芹菜是正确的后端吗?我想知道 "LocalExecutor" 是否真的更适合这个用例,因为事实上气流工作者没有直接执行计算(他们只调用远程服务)。
你最初的想法是我会同意的。拥有 150 个不同的工作流程,每个工作流程有 10K 个任务,这会导致一个完全动态且难以管理的场景。一方面你说每个任务只是一个简单的 gRPC 但同时你提到页面级任务真的很复杂以封装在单个任务后面并且存在外部依赖性可能导致以小时为单位的流量瓶颈。
如果我是你,我会重新设计解决方案并将页面级报告转移到不同的层。例如,创建一个可以执行所有这些复杂计算的服务将是比尝试在 Airflow 中实现它更好的选择。这样您可能会显着减少页面级任务的数量。
关于您的具体问题:
- Airflow 与大小写无关 - 每个场景都可以是完美的,具体取决于 设计。 Oozie 真的很老派,很笨重,没有太多的 Airfow 提供的集成功能。路易吉我没用过
- 如前所述,这种方法既不可预测又难以管理。我预见到混乱:)
- 挂起 UI 是一个很好的指标,表明您应该重新审视您的实施设计。但是 UI 应该是您的第一要务 - 您如何在单个工作流中监控和管理 10,000 个任务?正确 - 你不能。并将其乘以 150。
- 我不久前从一家公司读到一篇文章,他们在使用 Celery 进行横向扩展时遇到了问题,他们决定改为纵向扩展,运行 许多调度程序进程在同一个 VM 上并行处理。不太确定这是否是一个对您的方案有很大帮助的设置。
如果我是你,我会为所有 150 个站点使用一个工作流程。我会为每个网站创建一个 subdag(顺便说一句,official docs 中没有提到 'unstable' 这个词)并尝试将复杂的计算操作卸载到不同的层以减少数量尽可能多的页面级任务。