Python中有啥好用的开源任务调度管理项目

2022-04-26 19:09:01 浏览数 (1)

任务背景:

上个月领导给我一个模型工程化专项工作,大体内容就是,把模型团队交付的项目代码,部署到应用环境中,跑出来的结果供系统使用。这也是我最近一直在忙着做的一个事情,天天加班到8、9点。

不过,这并不是一个从0到1的工作,之前最开始是采用的Django框架搭建起一个服务,使用apschedule 做任务管理,但是没有可视化的监控和预警。

任务需求:

在实际生产中,因为业务系统是一个基本投资收益分析的系统,对于基金来说,多数的数据分析都是基于季报来的,所以模型运行在一定程度上运行频率并不高。

模型的运行任务大体的分为三块,

  1. 数据准备,检查数据是否已经下发,模型运行的前置要求
  2. 模型运行,检查模型是否运行完成,中间是否有报错
  3. 模型结果,检查目标结果表是否有模型跑出来的结果

这三步是具有依赖关系,后者的运行依赖前者运行完成。

理想目标:

在Java中有很多开源的任务管理项目,比如说国产的xxl-job。

地址:https://www.xuxueli.com/xxl-job/ 但是呢,模型相关的内容基本都是Python交付的,偶然还有matlab,所以期望能找到一个开源的Python任务管理调度项目

开源寻找:

1.Airflow

地址:https://github.com/apache/airflow

Airflow 是一个使用 Python 语言编写的 data pipeline 调度和监控工作流的平台。Airflow 是通过 DAG(Directed acyclic graph 有向无环图)来管理任务流程的任务调度工具, 不需要知道业务数据的具体内容,设置任务的依赖关系即可实现任务调度。

这个平台拥有和 Hive、Presto、MySQL、HDFS、Postgres 等数据源之间交互的能力,并且提供了钩子(hook)使其拥有很好地扩展性。除了一个命令行界面,该工具还提供了一个基于 Web 的用户界面可以可视化管道的依赖关系、监控进度、触发任务等。

airflow架构图

airflow可视化管理页面

总结:

这么看Airflow是一个很好的解决方案,但是呢,有一个比较尴尬的问题是,Airflow的运行是依赖Linux系统的,可是由于历史原因公司现在的生产上模型是运行在window server环境中,一个巨大的尴尬写在脸上,这么好用的工具因为客观限制无法使用。

2.Django Celery Flower

地址: https://github.com/celery/celery/

Celery 是一个简单、灵活且可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具。它是一个专注于实时处理的任务队列,同时也支持任务调度。

Celery本身不含消息服务,它使用第三方消息服务来传递任务,目前,Celery支持的消息服务有RabbitMQ、Redis甚至是数据库,当然Redis应该是最佳选择。

不像是Airflow,Celery本身也没有可视化页面管理,不过有相配套的可视化管理工具——Flower,地址:https://github.com/mher/flower

Flower 是一个基于 Web 的工具,用于监控和管理 Celery 集群。

Flower 具有以下重要的特性:

  • 任务进度和历史
  • 能够显示任务详细信息(参数、开始时间、运行时间等)
  • 图表和统计

Flower 管理页面

总结:

Celery是一个很好的任务调度框架,正如它说的那样,支持大量消息,可以支持到百万级别的量级。但是它用起来的还需要配置消息对列,redis或者mq,使用起来配置比较多,而且需要三方插件的支持。也是解决目前问题的一种方式,不过有种高射炮打蚊子的感觉,后面维护也很费劲。

3.Django Apscheduler

地址:https://github.com/jcass77/django-apscheduler

Apscheduler是Python的第三方库,提供了基于日期、固定时间间隔以及crontab 类型的任务,可以在主程序的运行过程中快速增加新作业或删除旧作业,如果把作业存储在数据库中,那么作业的状态会被保存,当调度器重启时,不必重新添加作业,作业会恢复原状态继续执行。

Apscheduler可以当作一个跨平台的调度工具来使用,可以做为 linux 系统crontab 工具或 windows 计划任务程序的替换。

相应的在Django中有集成包——django-apscheduler,它是一个 Django 应用程序,它为 APScheduler 添加了一个轻量级的包装器。它允许使用 Django 的 ORM 在数据库中存储持久作业。

总结:

这是目前正在使用的方式,目前历史上使用的是Django的1.x版本,而且并没有做可视化的管理,Django本身自带了一个admin管理页面,这个页面并不能满足所有的需求。

4.JobCenter(Flask Apscheduler)

地址:https://github.com/guomaoqiu/JobCenter

Jobcenter的slogan是Apscheduler的最佳实践,看名字是国人开发的。

特点:

  • 可视化界面操作
  • 定时任务统一管理
  • 完全完全的Crontab
  • 支持秒级任务
  • 作业任务可搜索、暂停、编辑、删除
  • 作业任务持久化存储、各种不同类型作业动态添加

Jobcenter任务列表

某个Job的日志

Jobcenter是基于Flask和Apscheduler开发的,本质上也是对Apscheduler的封装和使用,不过作者做了一个不错的前端。但列表中编辑功能不可用,也没有在列表操作中接入任务日志查看的功能。

总结:

有句话说,踏破铁鞋无觅处,得来全不费功夫。从目前来看,JobCenter的功能仿佛可以实现我的需求,本身模型的任务量级也不大,在百八十个左右。

倾向选择:

3、4的区别在于web管理的实现框架上,一个是Django,一个是Flask,两个框架的特点都非常的鲜明。

从目前的工作做下来,我个人倾向选择3或者4。

对于当前的实际情况来说,选择3的优点,是可以基于历史项目升级,部分的功能可以复用(之前是基于Api管理),缺点是需要自主开发可视化的管理。

选择4的优点,前端功能大部分已经实现了。缺点是还需要根据实际情况做功能改造,作者分享的源码中部分功能没有实现,看提交,最近的更新是14个月前,看样子维护的不勤快。

好了,具体怎么选择还得领导排版,或者你有什么更好的开源项目欢迎分享给我。

我是马拉松程序员,可不止代码。

0 人点赞