如何调度spark程序_如何定时,周期性的运行程序?Python APScheduler实现任务灵活调度...
在我們的開發(fā)工作中,時常會有這樣的開發(fā)需求,如需要定時或者周期性的運行某些程序,因此經(jīng)常用到一些定時服務(wù),如在 Linux系統(tǒng)中使用 Crond 服務(wù)實現(xiàn)程序的定時運行。
在 Python中也有這樣的一個模塊,那就是 APScheduler,它是基于Quartz 的一個 Python定時任務(wù)框架,實現(xiàn)了 Quartz的全部功能,使用起來十分簡單、高效。其提供了基于日期、固定時間間隔以及 Crontab類型的任務(wù),并且支持持久化任務(wù)。同時也提供了不同的存儲機制,可以方便與數(shù)據(jù)庫等第三方的外部持久化存儲進行協(xié)同工作。它主要包含了四種組件:
- Triggers:任務(wù)觸發(fā)器,任務(wù)以何種方式觸發(fā)。
- Job stores:任務(wù)存儲器,持久存儲任務(wù)。
- Executors:任務(wù)執(zhí)行器,執(zhí)行任務(wù)的模塊。
- Schedulers:任務(wù)調(diào)度器,通過配置 trigger、job store、executor等實現(xiàn)對任務(wù)的增刪改查等調(diào)度控制。
APScheduler安裝
安裝過程如下:
任務(wù)存儲器 Job stores
Job stores 存儲被調(diào)度的任務(wù),默認的任務(wù)存儲是簡單地把任務(wù)保存在內(nèi)存(MemoryJobStore)中,其他的任務(wù)存儲形式是將任務(wù)保存在數(shù)據(jù)庫中。一個任務(wù)的數(shù)據(jù)將在保存在持久化任務(wù)存儲時被序列化,在加載時被反序列化。調(diào)度器不能分享同一個任務(wù)存儲。job store支持主流的存儲機制:redis、mongodb、內(nèi)存等等。
以 MongoDBJobStore為例,實例如下:
執(zhí)行器 Executors
Executors 處理任務(wù)的運行,他們通常通過在任務(wù)中提交制定的可調(diào)用對象到一個線程或者進城池來進行,當(dāng)任務(wù)完成時,執(zhí)行器將會通知調(diào)度器。
調(diào)度器 Schedulers
通常在應(yīng)用只有一個調(diào)度器,調(diào)度器提供了處理任務(wù)存儲、調(diào)度器、觸發(fā)器合適的接口。配置任務(wù)存儲和執(zhí)行器可以在調(diào)度器中完成,例如添加、修改和移除任務(wù)。常用的調(diào)度器如下:
- BlockingScheduler:僅可用在當(dāng)前你的進程之內(nèi),與當(dāng)前的進行共享計算資源,適合于只在進程中運行單個任務(wù)的情況,通常在調(diào)度器是你唯一要運行的東西時使用。
- BackgroundScheduler: 在后臺運行調(diào)度,不影響當(dāng)前的系統(tǒng)計算運行,適合于要求任何在程序后臺運行的情況,當(dāng)希望調(diào)度器在應(yīng)用后臺執(zhí)行時使用。
- AsyncIOScheduler: 如果當(dāng)前系統(tǒng)中使用了async module,則需要使用異步的調(diào)度器,適合于使用asyncio框架的情況。
- GeventScheduler: 如果使用了 gevent,則需要使用該調(diào)度,適合于使用 gevent框架的情況。
- TornadoScheduler: 如果使用了Tornado, 則使用當(dāng)前的調(diào)度器,適合于使用 Tornado框架的應(yīng)用。
- TwistedScheduler:Twister應(yīng)用的調(diào)度器,適合使用Twisted框架的應(yīng)用。
- QtScheduler: Qt的調(diào)度器,適合使用QT的情況。
觸發(fā)器種類Triggers
Triggers 包含調(diào)度邏輯,每一個任務(wù)有它自己的觸發(fā)器,用于決定接下來哪一個任務(wù)運行,根據(jù) Triggers 中定義的時間點,執(zhí)行頻率,時間區(qū)間等等參數(shù)設(shè)置。除了他們自己初始配置以外,觸發(fā)器完全是無狀態(tài)的,觸發(fā)器有如下幾種:
- date:一次性任務(wù),即只執(zhí)行一次任務(wù)。
- interval:循環(huán)任務(wù),即按照時間間隔執(zhí)行任務(wù)。
- cron:定時任務(wù),即在每個時間段執(zhí)行任務(wù)。
interval 觸發(fā)器實例
指定觸發(fā)器為 interval,循環(huán)任務(wù),即按照 時間間隔 執(zhí)行任務(wù)。
參數(shù)如下
- year (int|str) :表示四位數(shù)的年份,如2019年
- month (int|str) :表示取值范圍為1-12月。
- day (int|str) :表示取值范圍為1-31日。
- week (int|str) :一年中的第幾周 (1-53)。
- day_of_week (int|str) :表示一周中的第幾天(0-6)。
- hour (int|str):表示取值范圍為0-23時。
- minute (int|str) :表示取值范圍為0-59分。
- second (int|str) :表示取值范圍為0-59秒。
- start_date (datetime|str) :表示開始時間。
- end_date (datetime|str) :表示結(jié)束時間。
- timezone (datetime.tzinfo|str) :表示時區(qū)取值。
如上,我們設(shè)定 每2秒執(zhí)行一次,運行結(jié)果如下:
date 觸發(fā)器實例
指定觸發(fā)器為 date,一次性任務(wù),即只執(zhí)行一次任務(wù)。
如上,我們設(shè)定任務(wù) 延時五秒 后執(zhí)行,運行結(jié)果如下:
cron 觸發(fā)器實例
指定觸發(fā)器為 cron,定時任務(wù),即在每個時間段執(zhí)行任務(wù)。
參數(shù)如下
- year (int|str) :表示四位數(shù)的年份,如2019年
- month (int|str) :表示取值范圍為1-12月。
- day (int|str) :表示取值范圍為1-31日。
- week (int|str) :一年中的第幾周 (1-53)。
- day_of_week (int|str) :表示一周中的第幾天(0-6)。
- hour (int|str):表示取值范圍為0-23時。
- minute (int|str) :表示取值范圍為0-59分。
- second (int|str) :表示取值范圍為0-59秒。
- start_date (datetime|str) :表示開始時間。
- end_date (datetime|str) :表示結(jié)束時間。
- timezone (datetime.tzinfo|str) :表示時區(qū)取值。
如上,我們設(shè)定在2、4月、7~9月,每天晚上22點21分執(zhí)行一次任務(wù),運行結(jié)果如下:
移除、暫停/恢復(fù)任務(wù)
總結(jié)
以上是生活随笔為你收集整理的如何调度spark程序_如何定时,周期性的运行程序?Python APScheduler实现任务灵活调度...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NDK 开发实战 - 封装 java 层
- 下一篇: robotframework 常用关键字