一种关于Storm使用的实时消息处理方法

文档序号:10470914阅读:239来源:国知局
一种关于Storm使用的实时消息处理方法
【专利摘要】本发明公开了一种关于Storm使用的实时消息处理方法,属于Storm技术领域,本发明要解决如何在消息处理的过程中不丢失数据,而且可以使整个处理系统具有很好的扩展性的问题。技术方案为:所有Topology的提交在Storm的客户端节点上进行,由Nimbus所在的控制节点分配给其他Supervisor所在的工作节点进行处理。Nimbus首先将提交的Topology进行分片,分成一个个的Task,并将Task和Supervisor相关的信息提交到 zookeeper集群上,Supervisor去zookeeper集群上认领自己的Task,通知自己的Worker进程进行Task的处理。
【专利说明】
一种关于Storm使用的实时消息处理方法
技术领域
[0001 ]本发明涉及一种Storm技术领域,具体地说是一种关于Storm使用的实时消息处理方法。
【背景技术】
[0002]随着互联网应用的高速发展,企业积累的数据量越来越大,越来越多。随着GoogleMapReduce、Hadoop等相关技术的出现,处理大规模数据变得简单起来,但是这些数据处理技术都不是实时的系统,它们的设计目标也不是实时计算。毕竟实时的计算系统和基于批处理模型的系统(如Hadoop )有着本质的区别。
[0003]但是随着大数据业务的快速增长,针对大规模数据处理的实时计算变成了一种业务上的需求,缺少“实时的Hadoop系统”已经成为整个大数据生态系统中的一个巨大缺失。Storm正是在这样的需求背景下出现的,Storm很好地满足了这一需求。Storm为集群组件,Storm的集群从形式上看和Hadoop的集群非常相似,也是采用主从架构。但是在Hadoop上面运行的是MapReduce的Job,而在Storm上面运行的是Topology。它们有很大的不同。它们之间的关键区别是,一个MapReduceJob会有启动、运行到最终会结束的过程,而一个Topology在启动后,会永远运行。在Storm的集群里面有两种节点:控制节点和工作节点。控制节点上面运行一个后台进程Nimbus,它的作用类似于Hadoop里面的JobTrackeroNimbus负责在集群里面分发执行代码,分配工作给工作节点,并且监控任务的执行状态。每一个工作节点上面运行一个叫作Supervisor的守护进程。Supervisor会监听分配给自己所在机器的工作,根据需要启动/关闭工作进程。每一个工作进程执行一个Topology的一个子集,一个运行的Topology由运行在很多机器上的很多工作进程组成。
[0004]在Storm出现之前,对于需要实现计算的任务,开发者需要手动维护一个消息队列和消息处理者所组成的实时处理网络,消息处理者从消息队列中取出消息进行处理,然后更新数据库,发送消息给其他队列。所有这些操作都需要开发者自己实现。这种编程实现的模式存在以下缺陷:
1、单调乏味性:开发者需要花费大部分时间去配置消息如何发送,消息发送到哪里,如何部署消息的处理者,如何部署消息的中间处理节点等。如果使用Storm进行处理,那么开发者只需要很少的消息处理逻辑代码,这样开发者就可以专注于业务逻辑的开发,从而大大提高了开发实时计算系统的效率;
2、脆弱性:程序不够健壮,开发者需要自己编写代码以保证所有的消息处理者和消息队列的正确运行;
3、可伸缩性差:当一个消息处理者能处理的消息达到自己能处理的峰值时,就需要对消息流进行分流,这时需要配置新的消息处理者,以让它们处理分流消息。
[0005]对于需要处理大量消息流的实时系统来说,消息处理始终是实时计算的基础,消息处理的最后就是对消息队列和消息处理者之间的组合。消息处理的核心是如何在消息处理的过程中不丢失数据,而且可以使整个处理系统具有很好的扩展性,以便能够处理更大的消息流。

【发明内容】

[0006]本发明的技术任务是针对以上不足之处,提供一种关于Storm使用的实时消息处理方法,来解决如何在消息处理的过程中不丢失数据,而且可以使整个处理系统具有很好的扩展性的问题。
[0007 ]本发明解决其技术问题所采用的技术方案是:
一种关于Storm使用的实时消息处理方法,在使用Storm的服务器集群中,使用Storm并依赖外部资源Zookeeper集群进行实时消息处理;Storm具有Nimbus和Supervisor,服务器集群的控制节点上部署Nimbus,服务器集群的每个工作节点上均部署Supervisor; Storm提交运行的程序为Topology ,Topology由Spout和Bolt构成;包括如下步骤:
(1)、Topology的提交在控制节点上进行,把代码首先存放到Nimbus所在的控制节点上,之后,把当前Storm运行的配置生成文件放到Nimbus所在的控制节点中,Nimbus所在的控制节点中同时还有序列化之后的Topo 1gy代码文件;
(2)、Nimbus在设定Topology所关联的Spouts和Bolts时,同时设置当前Spout和Bolt的worker进程的数目,即设置executor数目和task数目;根据worker进程的数目,尽量平均的将worker进程分配至各个工作节点运行;worker进程在哪个supervisor所在的工作节点上运行是由storm本身决定的;
(3 )、任务分配好之后,N i m b u s所在的控制节点将w ο r k e r进程的心跳信息提交到zookeeper 集群;
(4)、Supervisor所在的工作节点不断的轮询zookeeper集群,在zookeeper中保存了worker进程的心跳信息(所有Topology的任务分配信息、代码存储目录和任务之间的关联关系),Supervisor所在的工作节点通过轮询zookeeper中的内容,来领取自己的任务,启动worker进程运行;
(5)、一个Topology运行之后,不断的通过Spouts来发送Stream流,通过Bolts不断的处理接收到的Stream流,Stream流是无界的。
[0008]步骤(I)中,Topology的提交在控制节点上进行,把代码首先存放到Nimbus所在的控制节点的inbox目录下,之后,把当前Storm运行的配置生成文件stormconf.ser放到Nimbus所在的控制节点的stormdi st目录中,在stormdist目录中同时还有序列化之后的Topology代码文件;
步骤(2)中,一个Topology的task数目的总和与executor数目的总和一致。
[0009]步骤(3)中,zookeeper集群中设置有workerbeats节点,workerbeats节点存储了当前Topo I ogy的所有worker进程的心跳信息;
步骤(4)中,Supervisor所在的工作节点能够不断的轮询zookeeper集群,在zookeeper的assignments节点中保存了所有Topology的任务分配信息、代码存储目录和任务之间的关联关系,Supervisor所在的工作节点通过轮询zookeeper的assignments节点的内容,来领取自己的任务,启动worker进程运行。
[0010]Zookeeper是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务。[ΟΟ?? ] Storm具有Nimbus和Supervisor,服务器集群的控制节点上部署Nimbus,服务器集群的每个工作节点上均部署Supervisor ;NimbuS负责在服务器集群里面发送代码,分配Worker进程给工作节点,并且监控工作节点状态;Supervisor监听所在工作节点的工作,根据需要启动或关闭Worker进程;Nimbus和Supervi sor以及运行的Worker进程都把心跳信息保存在Zookeeper集群上;Nimbus根据Zookeerper集群上的心跳信息和任务运行状况,进行调度和分配Worker进程。
[0012]Storm提交运行的程序为Topo I ogy ,Topology处理的最小的消息单位是一个Tuple,也就是一个任意对象的数组;Topo 1gy由Spout和Bo It构成;Spout是发出Tuple的结点;Bolt能够随意订阅某个Spout或者Bolt发出的Tuple; Spout和Bolt都统称为component。
[0013]本发明的一种关于Storm使用的实时消息处理方法和现有技术相比,具有以下有益效果= Storm可以方便地在一个计算机集群中编写与扩展复杂的实时计算,用于实时处理,保证每个消息都会得到处理;而且它很快,在一个小集群中,每秒可以处理数以百万计的消息;并且可以使用任意编程语言来做开发。
【附图说明】
[0014]下面结合附图对本发明进一步说明。
[0015]附图1为一种关于Storm使用的实时消息处理方法的Storm架构图。
【具体实施方式】
[0016]下面结合附图及具体实施例对本发明作进一步说明。
[0017]本发明的一种关于Storm使用的实时消息处理方法,在使用Storm的服务器集群中,使用Storm并依赖外部资源Zookeeper集群进行实时消息处理;Storm具有Nimbus和Supervisor,服务器集群的控制节点上部署Nimbus,服务器集群的每个工作节点上均部署Supervisor ; Storm提交运行的程序为Topology,Topology由Spout和Bolt构成;包括如下步骤:
(1)、Topology的提交在控制节点上进行,把代码首先存放到Nimbus所在的控制节点的inbox目录下,之后,把当前Storm运行的配置生成文件stormconf.ser放到Nimbus所在的控制节点的stormdi st目录中,在stormdist目录中同时还有序列化之后的Topo 1gy代码文件;
(2)、Nimbus在设定Topology所关联的Spouts和Bolts时,同时设置当前Spout和Bolt的worker进程的数目,即设置executor数目和task数目;根据worker进程的数目,尽量平均的将worker进程分配至各个工作节点运行;worker进程在哪个supervisor所在的工作节点上运行是由storm本身决定的;一个Topology的task数目的总和与executor数目的总和一致
(3 )、任务分配好之后,N i m b u s所在的控制节点将w ο r k e r进程的心跳信息提交到zookeeper集群;zookeeper集群中设置有workerbeats节点,workerbeats节点存储了当前Topo I ogy的所有worker进程的心跳信息;
(4)、Supervi sor所在的工作节点能够不断的轮询zookeeper集群,在zookeeper的assignments节点中保存了worker进程的心跳信息(所有Topology的任务分配信息、代码存储目录和任务之间的关联关系),Supervisor所在的工作节点通过轮询zookeeper的assignments节点的内容,来领取自己的任务,启动worker进程运行
(5)、一个Topology运行之后,不断的通过Spouts来发送Stream流,通过Bolts不断的处理接收到的Stream流,Stream流是无界的。
[0018]最后一步会不间断的执行,除非手动结束Topology。
[0019]所有Topology任务的提交必须在Storm客户端节点上进行(需要配置storm.yaml文件),由Nimbus所在的控制节点分配给其他Supervisor所在的工作节点进行处理。Nimbus首先将提交的Topo 1gy进行分片,分成一个个的Task,并将Task和Supervi sor相关的信息提交到zookeeper集群上,Supervisor去zookeeper集群上认领自己的Task,通知自己的Worker进程进行Task的处理。
[0020]下面对Storm中的一些命令代码进行说明:
一、Spout
Spout是Stream的消息产生源,Spout组件的实现可以通过继承BaseRichSpout类或者其他Spout类来完成,也可以通过实现IRichSpout接口来实现。
[0021]public interface ISpout extends Serializable {
void open(Map conf, TopologyContext context, SpoutOutputCollectorcollector);
void close();void nextTuple();void ack(Object msgld);void fail(Object msgld);
} O
[0022]open()方法,是初始化方法。
[0023]closeO:在该spout将要关闭时调用。但是不保证其一定被调用,因为在集群中supervisor节点,可以使用kill _9来杀死worker进程。只有当Storm是在本地模式下运行,如果是发送停止命令,可以保证close的执行。
[0024]ack(Object msgld):成功处理tuple时回调的方法,通常情况下,此方法的实现是将消息队列中的消息移除,防止消息重放。
[0025]fail(Object msgld):处理tuple失败时回调的方法,通常情况下,此方法的实现是将消息放回消息队列中然后在稍后时间里重放。
[0026]nextTupleO:这是Spout类中最重要的一个方法。发射一个Tuple到Topology都是通过这个方法来实现的。调用此方法时,storm向spout发出请求,让spout发出元组(tuple)到输出器(ouput col lector)。这种方法应该是非阻塞的,所以spout如果没有元组发出,这个方法应该返回。nextTuple、ack和fail都在spout任务的同一个线程中被循环调用。当没有元组的发射时,应该让nextTuple睡眠一个很短的时间(如一毫秒),以免浪费太多的CPU。
[0027]继承了BaseRichSpout后,不用实现close、activate、deactivate、ack、fail和getComponentConf igurat1n方法,只关心最基本核心的部分。
[0028]通常情况下(Shell和事务型的除外),实现一个Spout,可以直接实现接口IRichSpout,如果不想写多余的代码,可以直接继承BaseRichSpout。
[0029]二、Bolt
Bolt类接收由Spout或者其他上游Bolt类发来的Tuple,对其进行处理。Bolt组件的实现可以通过继承BasicRichBolt类或者IRichBolt接口等来完成。
[0030]prepare方法:此方法和Spout中的open方法类似,在集群中一个worker中的task初始化时调用。它提供了bolt执行的环境。
[0031 ] declareOutputFields方法:用于声明当前BoIt发送的TupIe中包含的字段(field),和Spout中类似。
[0032]cleanup方法:同ISpout的close方法,在关闭前调用。同样不保证其一定执行。
[0033]execute方法:这是Bolt中最关键的一个方法,对于Tuple的处理都可以放到此方法中进行。具体的发送是通过emit方法来完成的。execute接受一个tuple进行处理,并用prepare方法传入的OutputCol lector的ack方法(表示成功)或fail (表示失败)来反馈处理结果。
[0034]Storm提供了IBasicBolt接口,其目的就是实现该接口的Bolt不用在代码中提供反馈结果了,Storm内部会自动反馈成功。如果你确实要反馈失败,可以抛出FailedExcept1n0
[0035]通常情况下,实现一个Bolt,可以实现IRichBolt接口或继承BaseRichBolt,如果不想自己处理结果反馈,可以实现IBasicBolt接口或继承BaseBasicBolt,它实际上相当于自动实现了collector, emit.ack(inputTuple) ο
[0036]三、Topology运行方式
在开始创建项目之前,了解Storm的操作模式(operat1n modes)是很重要的。Storm有两种运行方式,本地运行的提交方式和分布式提交方式。
[0037]本地运行的提交方式,例:
LocalCluster cluster = new LocalClusterO;cluster.submitTopo1gy(TOPOLOGY—NAME,conf,builder.createTopology());
Thread.sleep(2000);cluster.shutdown();
分布式提交方式,例:
StormSubmitter.submitTopology(TOPOLOGY—NAME, conf, builder.createTopology0)。
[0038]需要注意的是,在Storm代码编写完成之后,需要打包成jar包放到Nimbus中运行,打包的时候,不需要把依赖的jar都打迚去,否则如果把依赖的storm, jar包打进去的话,运行时会出现重复的配置文件错误导致Topology无法运行。因为Topology运行之前,会加载本地的storm.yaml配置文件。
[0039]运行的命令如下:stormjar StormTopology.jar mainclass [args]。
[0040]storm守护进程的命令:
Nimbus: storm nimbus 启动nimbus守护进程;
Supervisor: storm supervisor 启动supervisor守护迪程;
UI: storm ui这将启动stormUI的守护进程,为监测storm集群提供一个基于web的用户界面。
[0041 ] DRPC: storm drpc 启动DRPC的守护进程。
[0042]storm管理命令:
JAR:storm jar topology_jar topology_class [arguments...]。
[0043]jar命令是用于提交一个集群拓扑.它运行指定参数的topology_class中的main()方法,上传topology_jar到nimbus,由nimbus发布到集群中。一旦提交,storm将激活拓扑并开始处理topology_class中的main()方法,main()方法负责调用StormSubmitter.submitTopology O方法,并提供一个唯一的拓扑(集群)的名。如果一个拥有该名称的拓扑已经存在于集群中,jar命令将会失败。常见的做法是在使用命令行参数来指定拓扑名称,以便拓扑在提交的时候被命名。
[0044]KILL:storm kill topology_name [-w wait_time];
杀死一个拓扑,可以使用kill命令。它会以一种安全的方式销毁一个拓扑,首先停用拓扑,在等待拓扑消息的时间段内允许拓扑完成当前的数据流。执行kill命令时可以通过-W[等待秒数]指定拓扑停用以后的等待时间。也可以在Storm UI界面上实现同样的功能。
[0045]Deactivate:storm deactivate topology_name;
停用拓扑时,所有已分发的元组都会得到处理,spouts的nextTuple方法将不会被调用。也可以在Storm UI界面上实现同样的功能。
[0046]Activate:storm activate topology_name;
启动一个停用的拓扑。也可以在Storm UI界面上实现同样的功能。
[0047]Rebalance:storm rebalance topology_name [_w wait_time] [_n worker_count] [_e component_name=executer_count]...;
rebalance使你重新分配集群任务。这是个很强大的命令。比如,你向一个运行中的集群增加了节点。rebalance命令将会停用拓扑,然后在相应超时时间之后重分配worker,并重启拓扑;
例:storm rebalance wordcount-topology -w 15 -η 5 -e sentence-spout=4 ~esplit_bolt=8 o
[0048]还有其他管理命令,如:Remoteconfvalue、REPL、Classpath等新建storm项目注意事项。
[0049]为了开发storm项目,classpath里面需要有storm的jar包。最推荐的方式是使用Maven,不使用maven的话可以手动把storm发行版里面的所有的jar包添加到classpath。
[0050]通过上面【具体实施方式】,所述技术领域的技术人员可容易的实现本发明。但是应当理解,本发明并不限于上述的【具体实施方式】。在公开的实施方式的基础上,所述技术领域的技术人员可任意组合不同的技术特征,从而实现不同的技术方案。
[0051]除说明书所述的技术特征外,均为本专业技术人员的已知技术。
【主权项】
1.一种关于storm使用的实时消息处理方法,其特征在于在使用Storm的服务器集群中,使用Storm并依赖外部资源Zookeeper集群进行实时消息处理;Storm具有Nimbus和Supervisor,服务器集群的控制节点上部署Nimbus,服务器集群的每个工作节点上均部署Supervisor ; Storm提交运行的程序为Topology,Topology由Spout和Bolt构成;包括如下步骤: (1)、Topology的提交在控制节点上进行,把代码首先存放到Nimbus所在的控制节点上,之后,把当前Storm运行的配置生成文件放到Nimbus所在的控制节点中,Nimbus所在的控制节点中同时还有序列化之后的Topo 1gy代码文件; (2)、Nimbus在设定Topo1gy所关联的Spouts和Bolts时,同时设置当前Spout和Bolt的worker进程的数目,即设置executor数目和task数目;根据worker进程的数目,将worker进程分配至各个工作节点运行; (3 )、任务分配好之后,N i m b u s所在的控制节点将w ο r k e r进程的心跳信息提交到zookeeper 集群; (4)、Supervisor所在的工作节点不断的轮询zookeeper集群,在zookeeper中保存了worker进程的心跳信息,Supervisor所在的工作节点通过轮询zookeeper中的内容,来领取自己的任务,启动worker进程运行; (5)、一个Topology运行之后,不断的通过Spouts来发送Stream流,通过Bolts不断的处理接收到的Stream流,Stream流是无界的。2.根据权利要求1所述的一种关于Storm使用的实时消息处理方法,其特征在于步骤(1)中,Topology的提交在控制节点上进行,把代码首先存放到Nimbus所在的控制节点的inbox目录下,之后,把当前Storm运行的配置生成文件stormconf.ser放到Nimbus所在的控制节点的stormdist目录中,在stormdist目录中同时还有序列化之后的Topo1gy代码文件。3.根据权利要求1所述的一种关于Storm使用的实时消息处理方法,其特征在于步骤(2)中,一个Topology的task数目的总和与executor数目的总和一致。4.根据权利要求1所述的一种关于Storm使用的实时消息处理方法,其特征在于步骤(3)中,zookeeper集群中设置有workerbeats节点,workerbeats节点存储了当前Topo1gy的所有worker进程的心跳信息; 步骤(4)中,Supervi sor所在的工作节点能够不断的轮询zookeeper集群,在zookeeper的assignments节点中保存了所有Topology的任务分配信息、代码存储目录和任务之间的关联关系,Supervisor所在的工作节点通过轮询zookeeper的assignments节点的内容,来领取自己的任务,启动worker进程运行。
【文档编号】G06F9/44GK105824618SQ201610135228
【公开日】2016年8月3日
【申请日】2016年3月10日
【发明人】张福勋, 杨培强
【申请人】浪潮软件集团有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1