Spark Streaming 妙用之實現工作流調度器
來自: http://www.jianshu.com/p/89b4f3bf27b2
之前有說過要設計一個工作流調度器。開發一個完善的工作流調度器應該并不是一件簡單的事情。但是通過Spark Streaming(基于Transfomer架構的理念),我們可能能簡化這些工作。我在這塊并沒有什么經驗,這只是一個存在于腦海中的東西。
</div>
一個典型的工作流調度器架構可能如下:
也就是說要搭建一個穩定可靠的Azkaban的工作流調度器,你可能需要
- 兩臺 互為主備MySQL
- 兩臺Executor Server
- 一臺Web Server
- 你需要做架構設計,考慮WebServer 和 Executor Server的通訊問題
- 擴展性問題。Executor 能夠動態調整?
- 穩定性問題。畢竟24小時運行的
然而,你完全可以不需要關注這么多,按照Transfomer架構的設計,我們應該可以找到一個Estimator ,簡化我們的編程,我們只要按照Estimator的規范,
- 實現業務邏輯,也就是工作流的生成,解析,運行和存儲等操作。
- 實現管理頁面邏輯
- 指定需要的資源cpu/內存,就能Run起來這個Transformer
其他的事情應該都是Estimator 要去做的。我搜羅了一圈,發現Spark Streaming 是能夠滿足該需求的一個Estimator。
這得益于,Spark Streaming 從某個角度而言就是個定時任務調度系統,也就是我們說的微批處理。對于工作流調度器而言,無非就是每個周期(duration)在Driver端啟動線程掃描MySQL,實現任務的分發和執行。
那如果實現一個類似Azkaban 能夠的做的事情,前面我們提到,要做三件事情,分別對應為:
- 實現業務邏輯,也就是工作流的生成,解析,運行和存儲等操作。其中 生成 , 解析 , 存儲 三個環節可以放在Driver端,也可以都放在Executor 端。也就是說:Driver的設計可重可輕。重的設計可由Driver讀取MySQL 并且解析成工作流任務,然后發送給Executor 去執行。輕的設計Driver僅僅是讀取MySQL,然后就簡單將id分發給各個Executor,各個Executor 負責解析執行和反饋結果。
2.增強 Spark Streaming UI,添加管理頁面,實現Azkaban Web Server類似界面。
- 按標準的Spark Streaming 程序提交該實現到集群即可完成部署。
我們看到,我們真正做到了只關注核心業務邏輯的實現,所謂部署,安裝,運行等環節都實現了平臺化(其實Estimator完成了)。 而且實現了資源的細粒度(CPU/內存)劃分,而不再是以 服務器 為基本單元。
事實上,我們也可以將一個Spark Streaming當做一個crontab 任務,這樣就自然具有了一個分布式的crontab系統,并且提供更友好的管理,甚至能將任務本身融入到crontab中。
后話
Spark Streaming 不一定是最合適的Estimator,你可以自己實現一套類似的Estimator,最終形成所謂的 Azkaban On Yarn的程序。
</div>