NET Core的分布式批處理框架


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!

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM