Python开源任务调度管理项目的分析和对比(python 任务 调度 管理)

任务背景:

 

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

 

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

 

任务需求:

 

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

 

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

 

  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 的用户界面可以可视化管道的依赖关系、监控进度、触发任务等。

Python开源任务调度管理项目的分析和对比(python 任务 调度 管理)

airflow架构图

Python开源任务调度管理项目的分析和对比(python 任务 调度 管理)

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 具有以下重要的特性:

 

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

Python开源任务调度管理项目的分析和对比(python 任务 调度 管理)

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的最佳实践,看名字是国人开发的。

Python开源任务调度管理项目的分析和对比(python 任务 调度 管理)

Jobcenter的slogan

 

特点:

 

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

Python开源任务调度管理项目的分析和对比(python 任务 调度 管理)

Jobcenter任务列表

Python开源任务调度管理项目的分析和对比(python 任务 调度 管理)

某个Job的日志

 

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

 

总结:

 

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

 

倾向选择:

 

【重点】如果环境是Linux的话,或者可以更改/新建Linux的环境,那么一定要选择的Airflow,这是最佳实践。框架提供的功能和管理都很完善。

 

如果只能在window机器,在考虑其他的。

 

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

 

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

 

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

 

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

 

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

 

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

相关新闻

联系我们
联系我们
在线咨询
分享本页
返回顶部