任务背景:
上个月领导给我一个模型工程化专项工作,大体内容就是,把模型团队交付的项目代码,部署到应用环境中,跑出来的结果供系统使用。这也是我最近一直在忙着做的一个事情,天天加班到8、9点。
不过,这并不是一个从0到1的工作,之前最开始是采用的Django框架搭建起一个服务,使用apschedule 做任务管理,但是没有可视化的监控和预警。
任务需求:
在实际生产中,因为业务系统是一个基本投资收益分析的系统,对于基金来说,多数的数据分析都是基于季报来的,所以模型运行在一定程度上运行频率并不高。
模型的运行任务大体的分为三块,
- 数据准备,检查数据是否已经下发,模型运行的前置要求
- 模型运行,检查模型是否运行完成,中间是否有报错
- 模型结果,检查目标结果表是否有模型跑出来的结果
这三步是具有依赖关系,后者的运行依赖前者运行完成。
理想目标:
在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个月前,看样子维护的不勤快。
好了,具体怎么选择还得领导排版,或者你有什么更好的开源项目欢迎分享给我。
我是马拉松程序员,可不止代码。