Python開源任務(wù)調(diào)度管理項(xiàng)目的分析和對(duì)比(python 任務(wù) 調(diào)度 管理)
任務(wù)背景:
上個(gè)月領(lǐng)導(dǎo)給我一個(gè)模型工程化專項(xiàng)工作,大體內(nèi)容就是,把模型團(tuán)隊(duì)交付的項(xiàng)目代碼,部署到應(yīng)用環(huán)境中,跑出來(lái)的結(jié)果供系統(tǒng)使用。這也是我最近一直在忙著做的一個(gè)事情,天天加班到8、9點(diǎn)。
不過(guò),這并不是一個(gè)從0到1的工作,之前最開始是采用的Django框架搭建起一個(gè)服務(wù),使用apscheduler 做任務(wù)管理,但是沒有可視化的監(jiān)控和預(yù)警。
任務(wù)需求:
在實(shí)際生產(chǎn)中,因?yàn)闃I(yè)務(wù)系統(tǒng)是一個(gè)基本投資收益分析的系統(tǒng),對(duì)于基金來(lái)說(shuō),多數(shù)的數(shù)據(jù)分析都是基于季報(bào)來(lái)的,所以模型運(yùn)行在一定程度上運(yùn)行頻率并不高。
模型的運(yùn)行任務(wù)大體的分為三塊,
- 數(shù)據(jù)準(zhǔn)備,檢查數(shù)據(jù)是否已經(jīng)下發(fā),模型運(yùn)行的前置要求
- 模型運(yùn)行,檢查模型是否運(yùn)行完成,中間是否有報(bào)錯(cuò)
- 模型結(jié)果,檢查目標(biāo)結(jié)果表是否有模型跑出來(lái)的結(jié)果
這三步是具有依賴關(guān)系,后者的運(yùn)行依賴前者運(yùn)行完成。
理想目標(biāo):
在Java中有很多開源的任務(wù)管理項(xiàng)目,比如說(shuō)國(guó)產(chǎn)的xxl-job。
地址:https://www.xuxueli.com/xxl-job/ 但是呢,模型相關(guān)的內(nèi)容基本都是Python交付的,偶然還有matlab,所以期望能找到一個(gè)開源的Python任務(wù)管理調(diào)度項(xiàng)目
開源尋找:
1.Airflow
地址:https://github.com/apache/airflow
Airflow 是一個(gè)使用 Python 語(yǔ)言編寫的 data pipeline 調(diào)度和監(jiān)控工作流的平臺(tái)。Airflow 是通過(guò) DAG(Directed acyclic graph 有向無(wú)環(huán)圖)來(lái)管理任務(wù)流程的任務(wù)調(diào)度工具, 不需要知道業(yè)務(wù)數(shù)據(jù)的具體內(nèi)容,設(shè)置任務(wù)的依賴關(guān)系即可實(shí)現(xiàn)任務(wù)調(diào)度。
這個(gè)平臺(tái)擁有和 Hive、Presto、MySQL、HDFS、Postgres 等數(shù)據(jù)源之間交互的能力,并且提供了鉤子(hook)使其擁有很好的擴(kuò)展性。除了一個(gè)命令行界面,該工具還提供了一個(gè)基于 Web 的用戶界面可以可視化管道的依賴關(guān)系、監(jiān)控進(jìn)度、觸發(fā)任務(wù)等。
airflow架構(gòu)圖
airflow可視化管理頁(yè)面
總結(jié):
這么看Airflow是一個(gè)很好的解決方案,但是呢,有一個(gè)比較尷尬的問(wèn)題是,Airflow的運(yùn)行是依賴Linux系統(tǒng)的,可是由于歷史原因公司現(xiàn)在的生產(chǎn)上模型是運(yùn)行在window server環(huán)境中,一個(gè)巨大的尷尬寫在臉上,這么好用的工具因?yàn)榭陀^限制無(wú)法使用。
2.Django Celery Flower
地址: https://github.com/celery/celery/
Celery 是一個(gè)簡(jiǎn)單、靈活且可靠的分布式系統(tǒng),用于處理大量消息,同時(shí)為操作提供維護(hù)此類系統(tǒng)所需的工具。它是一個(gè)專注于實(shí)時(shí)處理的任務(wù)隊(duì)列,同時(shí)也支持任務(wù)調(diào)度。
Celery本身不含消息服務(wù),它使用第三方消息服務(wù)來(lái)傳遞任務(wù),目前,Celery支持的消息服務(wù)有RabbitMQ、Redis甚至是數(shù)據(jù)庫(kù),當(dāng)然Redis應(yīng)該是最佳選擇。
不像是Airflow,Celery本身也沒有可視化頁(yè)面管理,不過(guò)有相配套的可視化管理工具——Flower,地址:https://github.com/mher/flower
Flower 是一個(gè)基于 Web 的工具,用于監(jiān)控和管理 Celery 集群。
Flower 具有以下重要的特性:
- 任務(wù)進(jìn)度和歷史
- 能夠顯示任務(wù)詳細(xì)信息(參數(shù)、開始時(shí)間、運(yùn)行時(shí)間等)
- 圖表和統(tǒng)計(jì)
Flower 管理頁(yè)面
總結(jié):
Celery是一個(gè)很好的任務(wù)調(diào)度框架,正如它說(shuō)的那樣,支持大量消息,可以支持到百萬(wàn)級(jí)別的量級(jí)。但是它用起來(lái)的還需要配置消息隊(duì)列,redis或者mq,使用起來(lái)配置比較多,而且需要三方插件的支持。也是解決目前問(wèn)題的一種方式,不過(guò)有種高射炮打蚊子的感覺,后面維護(hù)也很費(fèi)勁。
3.Django Apscheduler
地址:https://github.com/jcass77/django-apscheduler
Apscheduler是Python的第三方庫(kù),提供了基于日期、固定時(shí)間間隔以及crontab 類型的任務(wù),可以在主程序的運(yùn)行過(guò)程中快速增加新作業(yè)或刪除舊作業(yè),如果把作業(yè)存儲(chǔ)在數(shù)據(jù)庫(kù)中,那么作業(yè)的狀態(tài)會(huì)被保存,當(dāng)調(diào)度器重啟時(shí),不必重新添加作業(yè),作業(yè)會(huì)恢復(fù)原狀態(tài)繼續(xù)執(zhí)行。
Apscheduler可以當(dāng)作一個(gè)跨平臺(tái)的調(diào)度工具來(lái)使用,可以作為 linux 系統(tǒng)crontab 工具或 windows 計(jì)劃任務(wù)程序的替換。
相應(yīng)的在Django中有集成包——django-apscheduler,它是一個(gè) Django 應(yīng)用程序,它為 APScheduler 添加了一個(gè)輕量級(jí)的包裝器。它允許使用 Django 的 ORM 在數(shù)據(jù)庫(kù)中存儲(chǔ)持久作業(yè)。
總結(jié):
這是目前正在使用的方式,目前歷史上使用的是Django的1.x版本,而且并沒有做可視化的管理,Django本身自帶了一個(gè)admin管理頁(yè)面,這個(gè)頁(yè)面并不能滿足所有的需求。
4.JobCenter(Flask Apscheduler)
地址:https://github.com/guomaoqiu/JobCenter
Jobcenter的slogan是Apscheduler的最佳實(shí)踐,看名字是國(guó)人開發(fā)的。
Jobcenter的slogan
特點(diǎn):
- 可視化界面操作
- 定時(shí)任務(wù)統(tǒng)一管理
- 完全完全的Crontab
- 支持秒級(jí)任務(wù)
- 作業(yè)任務(wù)可搜索、暫停、編輯、刪除
- 作業(yè)任務(wù)持久化存儲(chǔ)、各種不同類型作業(yè)動(dòng)態(tài)添加
Jobcenter任務(wù)列表
某個(gè)Job的日志
Jobcenter是基于Flask和Apscheduler開發(fā)的,本質(zhì)上也是對(duì)Apscheduler的封裝和使用,不過(guò)作者做了一個(gè)不錯(cuò)的前端。但列表中編輯功能不可用,也沒有在列表操作中接入任務(wù)日志查看的功能。
總結(jié):
有句話說(shuō),踏破鐵鞋無(wú)覓處,得來(lái)全不費(fèi)功夫。從目前來(lái)看,JobCenter的功能仿佛可以實(shí)現(xiàn)我的需求,本身模型的任務(wù)量級(jí)也不大,在百八十個(gè)左右。
傾向選擇:
【重點(diǎn)】如果環(huán)境是Linux的話,或者可以更改/新建Linux的環(huán)境,那么一定要選擇的Airflow,這是最佳實(shí)踐。框架提供的功能和管理都很完善。
如果只能在window機(jī)器,在考慮其他的。
3、4的區(qū)別在于web管理的實(shí)現(xiàn)框架上,一個(gè)是Django,一個(gè)是Flask,兩個(gè)框架的特點(diǎn)都非常的鮮明。
從目前的工作做下來(lái),我個(gè)人傾向選擇3或者4。
對(duì)于當(dāng)前的實(shí)際情況來(lái)說(shuō),選擇3的優(yōu)點(diǎn),是可以基于歷史項(xiàng)目升級(jí),部分的功能可以復(fù)用(之前是基于Api管理),缺點(diǎn)是需要自主開發(fā)可視化的管理。
選擇4的優(yōu)點(diǎn),前端功能大部分已經(jīng)實(shí)現(xiàn)了。缺點(diǎn)是還需要根據(jù)實(shí)際情況做功能改造,作者分享的源碼中部分功能沒有實(shí)現(xiàn),看提交,最近的更新是14個(gè)月前,看樣子維護(hù)的不勤快。
好了,具體怎么選擇還得領(lǐng)導(dǎo)決定,或者你有什么更好的開源項(xiàng)目歡迎分享給我。
我是馬拉松程序員,可不止代碼。