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!
NET Core的分布式批处理框架的更多相关文章
- Swift:一个基于.NET Core的分布式批处理框架
Swift是什么 从文章的标题可知:此Swift非Apple那个Swift,只是考虑这个词的含义比较适合. Swift是一个基于.NET Core的分布式批处理框架,支持将作业分割后分发到多台服务器并 ...
- 分布式批处理平台(wolf)简介
"wolf"即狼,狼的适应性很强.可栖息范围包括苔原.草原.森林.荒漠.农田等多种生境:具有敏锐的观察力.专一的目标.默契的配合,它们总能依靠团体的力量达成目标. 分布式批处理平台 ...
- c#实例化继承类,必须对被继承类的程序集做引用 .net core Redis分布式缓存客户端实现逻辑分析及示例demo 数据库笔记之索引和事务 centos 7下安装python 3.6笔记 你大波哥~ C#开源框架(转载) JSON C# Class Generator ---由json字符串生成C#实体类的工具
c#实例化继承类,必须对被继承类的程序集做引用 0x00 问题 类型“Model.NewModel”在未被引用的程序集中定义.必须添加对程序集“Model, Version=1.0.0.0, Cu ...
- .Net Core 集成ExceptionLess分布式日志框架之本地化部署
前言 公司目前使用的项目中关于日志记录这块,之前一直都是使用的Log4net 存放于后台文件中的,对于异常错误啊,或者需要查看一些详情错误的时候感觉很不方便,要到服务器上去打开日志文件检索错误,降低了 ...
- 【转】大数据批处理框架 Spring Batch全面解析
如今微服务架构讨论的如火如荼.但在企业架构里除了大量的OLTP交易外,还存在海量的批处理交易.在诸如银行的金融机构中,每天有3-4万笔的批处理作业需要处理.针对OLTP,业界有大量的开源框架.优秀的架 ...
- 微软开源 WCF 分布式服务框架,并入 .NET 基金会项目
微软北京时间2015.5.20 在其 .NET Foundation GitHub 开源项目页中开放了 WCF 分布式服务框架的代码.WCF突然之间成为一个热门话题,在各大网站上都有不同的报道:dot ...
- Spring Batch 批处理框架
<Spring Batch 批处理框架>基本信息作者: 刘相 出版社:电子工业出版社ISBN:9787121252419上架时间:2015-1-24出版日期:2015 年2月开本:16开页 ...
- 图书简介:Spring Batch批处理框架
大数据时代批处理利器,国内首度原创解析Spring Batch框架. 内容简介: <Spring Batch 批处理框架>全面.系统地介绍了批处理框架Spring Batch,通过详尽的实 ...
- 基于Dubbo的分布式事务框架(LCN)
原文地址:http://原文地址:https://github.com/1991wangliang/transaction 基于Dubbo的分布式事务框架(LCN) 该框架依赖Redis/dubbo/ ...
随机推荐
- sqlite:多线程操作数据库“database is locked”解决方法
1. 使sqlite支持多线程(不确定是否非加不可,暂且加上,以备后患) 可以在编译时/启动时/运行时选择线程模式,参考:http://www.cnblogs.com/liaj/p/4015219.h ...
- 无言以队Alpha阶段项目复审
小组的名字和链接 优点 缺点,bug报告 (至少140字) 最终名次 (无并列) 甜美女孩 http://www.cnblogs.com/serendipity-zeng/p/9937832.html ...
- C/C++语法知识点汇总
* 静态局部变量,在不同函数中可以同名. 静态全局变量,在不同文件中可以同名. 静态函数,在不同文件中可以同名. * 普通全局变量和普通函数,在同一工程中不能同名. 在相链接的程序与库之间,可以同 ...
- linux命令学习笔记(27):linux chmod命令
chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是 包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. Linux系统中的 ...
- P4311 士兵占领[最大流]
题目地址 有一个$M * N$的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放置了$L_ ...
- CodeForces - 767A Snacktower
题目大意 一个数可以被输出当且仅当所有比它大的数都已经输出.输入一个1~n的排列,求每次输出的输出序列. 题解 直接用堆模拟 #include <queue> #include <c ...
- 【LeetCode】042 Trapping Rain Water
题目: Given n non-negative integers representing an elevation map where the width of each bar is 1, co ...
- ubuntu下 修改主机名
sudo gedit /etc/hostname 写入: sudo gedit /etc/hosts
- 面向对象(static关键字)
static关键字:用于修饰成员(成员变量和成员函数) 被修饰后的成员具备以下特点: 随着类的加载而加载 优先于对象存在 被所有的对象共享 可以直接被类名调用 使用注意: 静态方法只能访问静态成员 静 ...
- WPF win7+vs2010开发的打印功能,怎么在XP系统上无法打印
在wpf 中打印功能很强大,但最近是在win7上可以但是布置到xp上就不可以了,查了好多资料终于知道怎么回事了原来xp里没有.net framework3.5 安装一个就OK了要先安装4.0.