NET Core的分布式批處理框架
Swift是什么
從文章的標題可知:此Swift非Apple那個Swift,只是考慮這個詞的含義比較適合。
Swift是一個基於.NET Core的分布式批處理框架,支持將作業分割后分發到多台服務器並行處理,可成倍提升大量數據的處理速度。
GitHub地址:https://github.com/bosima/Swift
原理
Swift作業處理分為3步:分割作業、執行任務、合並結果。
Swift由多個成員節點組成集群,成員分為Manager和Worker,Manager負責分割作業和合並結果,Worker負責執行具體的任務。
Manager同時只有一個,自動選舉產生,集群工作需要至少2個節點,節點數>=3才有意義。
Swift通過啟動子進程來處理作業,原則上可以支持各類語言開發的程序,目前僅實現了.NET Core作業的支持。
Swift依賴Consul管理集群節點,每台部署了Swift節點的機器都需要部署Consul。
Swift作業的元數據都保存在集中的配置中心,各個節點從配置中心拉取最新的配置用於處理作業,以及將自身的工作狀態實時更新到配置中心。
Swfit使用
運行環境搭建
Swift基於.NET Core平台,可以運行在Windows、Linux、Mac等多種操作系統,動手能力強的同學可以在自己熟悉的環境手動部署。
不過使用docker可以快速創建一個Swift集群,省去下載、部署、配置等各種麻煩事,如果你的程序沒有重度使用Consul,也可以考慮用於生產環境。
1、docker
(1)使用解決方案中的Dockerfile生成Swift鏡像:
docker build -t fireflysoft/swift:latest .
(2)啟動Swift容器:
沒有Consul集群的情況下,為了方便測試,支持通過參數 -consulboot 啟動Consul Agent,使之作為Consul集群的Server和Leader。
生產環境下為了數據安全,應該有專門的Consul Server節點。
docker run --name swift1 -d -p 9632:9632 fireflysoft/swift:latest -cluster=test -consulboot
參數 -cluster 指定了Swift集群的名稱。這里同時將9632端口映射到了主機,這個是Swift管理界面程序的端口。
已經有Consul Server節點的情況下,這樣啟動容器:
docker run --name swift2 -d fireflysoft/swift:latest -cluster=test -consuljoinip=172.17.0.2
參數 -consuljoinip 指定了容器中的Consul節點要加入的Consul集群中的任意一個節點。
建議啟動3個Swift容器,以方便進行測試。
2、手動部署
(1)部署Consul 這里只是大概說下Consul的部署,具體的使用或問題請網絡搜索,也歡迎加入Consul交流群討論(234939415)。
點擊這里下載Consul程序包,然后編寫節點配置,舉個例子:集群dc1的192.168.0.2節點,它是一個server節點,通過節點192.168.0.3連接到集群,集群預料有3個Server節點。
{ "datacenter": "dc1", "data_dir": "/usr/local/consul/data", "node_name": "192.168.0.2", "advertise_addr": "192.168.0.2", "start_join": ["192.168.0.3"], "rejoin_after_leave": true, "server": true, "bootstrap-expect":3, "ui": true }
然后使用命令啟動這個節點:
consul agent -config-dir ./conf
測試環境1個Server節點就夠了,生產環境建議啟動3或5個Server節點。
(2)部署Swift Swift當前有2個核心程序:
節點程序(Swift)和管理界面程序(Swift.Management),前者是一個控制台程序,后者是一個Web程序。
這兩個程序部署起來很簡單,需要注意當前機器上需要已經部署了Consul節點。
首先使用Visual Studio發布程序,然后部署到指定的目錄,使用命令行啟動。 啟動節點程序:
dotnet /app/swift/Swift.dll -c swiftcluster
啟動管理界面程序(只需要在其中1個機器部署即可):
dotnet /app/management/Swift.Management.dll --urls "http://0.0.0.0:9632"
用戶可以通過管理界面查看集群節點,上傳作業包,監控作業運行,下載作業結果,也可以很方便的運行作業和取消作業。
Swift節點建議不要少於3個,最少2個。
創建作業
VS解決方案中提供了一個作業的例子:Swift.DemoJob,可以參考來創建自己的作業。
1、編寫作業
用戶首先需要按照Swift的規范編寫作業處理程序,作業處理程序包括三部分:分割任務、執行任務、合並任務。
這三部分對應到程序中是三個方法,Swift規定了方法的名稱和輸入輸出類型,用戶實現內部邏輯即可。
2、打包作業
打包作業處理程序首先需要編譯程序,建議使用命令:
dotnet publish -c Release
然后附加一個名為job.json的作業配置文件,其中指定作業的名稱、可執行文件名、計划執行時間等信息:
{ "Name": "DemoJob", // 作業名稱 "FileName": "Swift.JobEntryPoint.dll", // 作業可執行文件,目前固定為.NET Core對應入口文件,不要改動 "ExeType": "dotnet", // 作業可執行文件類型,目前僅支持dotnet "JobClassName": "Swift.DemoJob.dll,Swift.DemoJob.DemoJob", // 作業所在文件和類的全名稱 "RunTimePlan": [ "10m" ], // 作業運行時間計划,可以指定多個 "TaskExecuteTimeout": 1440, // 單個任務執行超時時間,默認1440分鍾 "MemberUnavailableThreshold": 10, // 節點不可用的認定閾值,默認10分鍾 "JobSplitTimeout":120, // 作業分割超時時間,默認120分鍾 "TaskResultCollectTimeout":120 // 任務結果合並超時時間,默認120分鍾 }
運行時間計划格式說明:
- HH:mm 每天定時運行
- ddd HH:mm 每周定時運行
- MM-dd HH:mm 每月定時運行
- yyyy-MM-dd HH:mm 定時運行一次
- dH 每d小時執行一次
- dm 每m分鍾執行一次
然后將這些全部打包到一個zip文件,文件名需要和job.json中的作業名稱一致。
3、運行作業
將打包的zip文件通過Swift管理界面上傳,稍等幾秒鍾,Swift會自動發現作業包,並分發到集群中。 現在你可以直接點擊運行作業,也可以等待作業按照計划執行。
后記
這個程序還很簡單,代碼寫的也有些丑陋,還有很多設想沒有實現,如有興趣,歡迎Fork!