Swift:一個基於.NET Core的分佈式批處理框架

Swift是什麼

從文章的標題可知:此Swift非Apple那個Swift,只是考慮這個詞的含義比較適合。html

Swift是一個基於.NET Core的分佈式批處理框架,支持將做業分割後分發到多臺服務器並行處理,可成倍提高大量數據的處理速度。node

GitHub地址:https://github.com/bosima/Swiftgit

原理

Swift做業處理分爲3步:分割做業、執行任務、合併結果。github

Swift由多個成員節點組成集羣,成員分爲Manager和Worker,Manager負責分割做業和合並結果,Worker負責執行具體的任務。docker

Manager同時只有一個,自動選舉產生,集羣工做須要至少2個節點,節點數>=3纔有意義。json

Swift經過啓動子進程來處理做業,原則上能夠支持各種語言開發的程序,目前僅實現了.NET Core做業的支持。bootstrap

Swift依賴Consul管理集羣節點,每臺部署了Swift節點的機器都須要部署Consul。swift

Swift做業的元數據都保存在集中的配置中心,各個節點從配置中心拉取最新的配置用於處理做業,以及將自身的工做狀態實時更新到配置中心。安全

Swfit使用

運行環境搭建

Swift基於.NET Core平臺,能夠運行在Windows、Linux、Mac等多種操做系統,動手能力強的同窗能夠在本身熟悉的環境手動部署。服務器

不過使用docker能夠快速建立一個Swift集羣,省去下載、部署、配置等各類麻煩事,若是你的程序沒有重度使用Consul,也能夠考慮用於生產環境。

 一、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容器,以方便進行測試。

二、手動部署

(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,能夠參考來建立本身的做業。

 一、編寫做業

用戶首先須要按照Swift的規範編寫做業處理程序,做業處理程序包括三部分:分割任務、執行任務、合併任務。

這三部分對應到程序中是三個方法,Swift規定了方法的名稱和輸入輸出類型,用戶實現內部邏輯便可。

 二、打包做業

打包做業處理程序首先須要編譯程序,建議使用命令:

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中的做業名稱一致。

三、運行做業

將打包的zip文件經過Swift管理界面上傳,稍等幾秒鐘,Swift會自動發現做業包,並分發到集羣中。 如今你能夠直接點擊運行做業,也能夠等待做業按照計劃執行。

後記

這個程序還很簡單,代碼寫的也有些醜陋,還有不少設想沒有實現,若有興趣,歡迎Fork!

個人獨立博客地址:https://blog.bossma.cn/csharp/swift-is-a-distributed-processing-framework-of-batch-data-based-on-dotnetcore/

相關文章
相關標籤/搜索