Swift:一个基于.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!
Swift:一个基于.NET Core的分布式批处理框架的更多相关文章
- NET Core的分布式批处理框架
NET Core的分布式批处理框架 Swift是什么 从文章的标题可知:此Swift非Apple那个Swift,只是考虑这个词的含义比较适合. Swift是一个基于.NET Core的分布式批处理框架 ...
- 如何创建一个基于 .NET Core 3 的 WPF 项目
在 Connect(); 2018 大会上,微软发布了 .NET Core 3 Preview,以及基于 .NET Core 3 的 WPF:同时还发布了 Visual Studio 2019 预览版 ...
- 一个基于 .NET Core 2.0 开发的简单易用的快速开发框架 - LinFx
LinFx 一个基于 .NET Core 2.0 开发的简单易用的快速开发框架,遵循领域驱动设计(DDD)规范约束,提供实现事件驱动.事件回溯.响应式等特性的基础设施.让开发者享受到正真意义的面向对象 ...
- 基于redis的简易分布式爬虫框架
代码地址如下:http://www.demodashi.com/demo/13338.html 开发环境 Python 3.6 Requests Redis 3.2.100 Pycharm(非必需,但 ...
- 一个基于Net Core3.0的WPF框架Hello World实例
目录 一个基于Net Core3.0的WPF框架Hello World实例 1.创建WPF解决方案 1.1 创建Net Core版本的WPF工程 1.2 指定项目名称,路径,解决方案名称 2. 依赖库 ...
- Struts2是一个基于MVC设计模式的Web应用框架
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互. Struts ...
- RCF:一个相当不错的C++分布式RPC框架
RCF(远程调用框架)是一个可以移植的C++进程间通信框架,使用C++语言特性,提供了一个简单高效的编写分布式C++软件的途径.RCF利用编译时多态清晰分开了接口和实现. 和传统的RPC框架如CORB ...
- 分享一个基于Net Core 3.1开发的模块化的项目
先简单介绍下项目(由于重新基于模块化设计了整个项目,所以目前整个项目功能不多) 1.Asp.Net Core 3.1.2+MSSQL2019(LINUX版) 2.中间件涉及Redis.RabbitMQ ...
- 一个基于EntityFramework Core的简单数据库访问层,适用于轻量级数据库业务
这个访问层的代码实际上是园子里某个前辈的,本人只是觉得好使,记录了下来. 本访问层需要通过Nuget安装EntityFramework Core,不过个人认为EF 6同样可以使用. 搭配数据库,最好是 ...
随机推荐
- pyhton中list的基本操作
list:可以按规则,按顺序,存取大量数据 1.增 append() 在列表尾部追加元素 insert() 按照列表索引添加元素 extend() 迭代添加元素,一次添加多个元素 2.删 pop() ...
- Python基础-面向过程编程实现Linux下cat -rl ‘dir’ |grep ‘keywords’ 功能
函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...
- Python基础-简介二
一.变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些 ...
- LeetCode-Largest Rectangle in Histogram O(n) 详析-ZZ
http://www.cnblogs.com/felixfang/p/3676193.html Largest Rectangle in Histogram Given n non-negative ...
- 【Leetcode】【Easy】Reverse Linked List
题目: Reverse a singly linked list. 解题: 反转单链表,不再多介绍了. 如果会“先条件->定参数->确定不变式->验证后条件”的思维方法,一定会bug ...
- c# 知识学习
1.C#基础知识梳理系列 2.详解C#委托,事件与回调函数 3.C#制作Windows service
- ssh_exchange_identification: Connection closed by remote host
用服务器内网ip连接同子网服务器的时候显示ssh_exchange_identification: Connection closed by remote host 防火墙什么都关闭了,还是显示这个问 ...
- 关于 Windows 7 语言包
在对IE浏览器进行多语言对应的时候,网页会检测当前系统的语言,来判断网页需要以哪种语言显示.但是,在给系统安装指定语言包时,可能会遇到安装失败的情况,原因就是需要在你的电脑上安装必需的基本语言包.请看 ...
- selenium+python 数据驱动-txt篇
#循环读取txt文件中的数据,可以作为用户名,密码等使用from selenium import webdriver #创建两个列表user=[]pwd=[]f=open(r'C:\bbs\data\ ...
- CountDownLatch的简单使用
from https://www.jianshu.com/p/cef6243cdfd9 1.CountDownLatch是什么? CountDownLatch是一个同步工具类,它允许一个或多个线程一直 ...