DAG(有向无环图)动态作业调度程序

时间:2013-01-12 10:55:58

标签: python scheduling etl directed-acyclic-graphs oozie

我需要管理ETL任务的大型工作流程,执行时间取决于时间,数据可用性或外部事件。在执行工作流程期间,某些作业可能会失败,系统应该能够重新启动失败的工作流程分支,而无需等待整个工作流程完成执行。

python中是否有可以处理此问题的框架?

我看到了几个核心功能:

  • DAG bulding
  • 执行节点(使用wait,log等运行shell cmd)。
  • 能够在执行期间在父DAG中重建子图
  • 在父图运行时手动执行节点或子图的能力
  • 在等待外部事件时暂停图表执行
  • 列出作业队列和作业详细信息

Oozie之类的东西,但更多的是通用目的而且在python中。

3 个答案:

答案 0 :(得分:29)

1)您可以尝试dagobah,如其github页面所述:Dagobah是一个用Python编写的简单的基于依赖关系的作业调度程序。 Dagobah允许您使用Cron语法安排定期作业。然后,每个作业按照依赖关系图定义的顺序启动一系列任务(子过程),您可以通过Web界面中的单击并拖动轻松绘制。与以下三个相比,这是最轻量级的调度程序项目。

dagobah's web interface

2)就ETL任务而言,Spotify开源的luigi更多地关注hadoop作业,如上所述:Luigi是一个Python模块,可帮助您构建批处理作业的复杂管道。它处理依赖项解析,工作流管理,可视化等。它还内置了Hadoop支持。

luigi's web interface

这两个模块都主要用Python编写,并且包含Web界面以便于管理。

据我所知,' luigi'我没有为工作任务提供调度程序模块,我认为这是ETL任务所必需的。但是使用' luigi'更容易在Python中编写map-reduce代码,并且每天在Spotify运行的数千个任务依赖于它。

3)与luigi一样,Pinterest开源了一个名为Pinball的工作流管理器。 Pinball的架构遵循一个主工作者(或主客户端,以避免与我们在下面介绍的特殊类型的客户端命名混淆)范式,其中有状态的中央主人充当关于当前系统状态的无状态客户端的真相来源。它可以顺利整合hadoop / hive / spark工作。

pinball's web interface

4)Airflow,另一个由Airbnb开源的dag工作计划项目,与Luigi和Pinball非常相似。后端基于Flask,Celery等构建。根据{{​​3}},Airflow既强大又易于使用。

airflow's web interface

最后但并非最不重要的是,Luigi,Airflow和Pinball可能会被更广泛地使用。这三者之间有很好的比较:example job code

答案 1 :(得分:8)

有很多这些;每个人似乎都在写自己的。 https://github.com/common-workflow-language/common-workflow-language/wiki/Existing-Workflow-systems有一个很好的清单。其中包括源自工业界和学术界的系统。

答案 2 :(得分:1)

你看过Ruffus吗?

我没有使用它的经验,但它似乎做了你的清单上的一些项目。它看起来也非常具有可攻击性,因此您可以自己实现其他要求。