今天结合JStorm官方Demo,进一步研磨学习了JStorm提交任务到分配任务的过程,下面是自己的一些认识与理解。
Topology是JStorm对有向无环图的抽象,其内部封装了数据源spout和数据处理对象bolt,以及spout和bolt、bolt和bolt之间的关系。
1) Demo中SequenceTopology对象的SetBuilder(TopologyBuilder builder, Map conf)方法根据用户提交到JStorm集群的配置文件,使用TopologyBuilder方法构造Topology的spout和bolt,以及spout和bolt之间的关系,Demo中主要是SequenceSpout、MergerRecord、SplitRecord、PairCount、TotalCount之间的订阅关系。
2) TopologyBuilder构造好Topology之后,通过Jstorm Client的StormSubmitter.submitTopology(streamName, conf,builder.createTopology())提交Topology到Jstorm集群。
3) 提交成功后,NimbusServer通过ServiceHandler.submitTopologyWithOpts(String topologyname, String uploadedJarLocation, String jsonConf, StormTopology topology, SubmitOptions options)方法处理接收到的topology,并在该方法中实例化一个TopologyAssignEvent,相当于创建了一个topology作业,然后将其保存到TopologyAssign的任务队列中。
4) TopologyAssign是Jstorm的一个任务分配器,它会根据配置和Topology中spout和bolt以及bolt相互之间的关系来进行Task的创建和分配,但是具体任务的创建和分配并非TopologyAssign自身完成的,而是调用Jstorm的调度器完成的, Jstorm允许用户根据自己的业务需求自定义调度器。该类是一个实现了Runnable接口的后台线程,随着Nimbus启动,主要完成topology作业分配、备份和作业均衡的作用,它的run方法采用阻塞的方式获取自身作业队列中的作业,然后进行作业分配。
5) NimbusServer将任务分配好后,并且创建到ZK上,此时就需要supervisor认领自己的任务了,supervisor获取任务的具体逻辑封装在SyncSupervisorEvent中,其也是一个后台线程,会不停获取ZK上(JSTORM_ROOT/assignments下)的任务,然后把自己的任务保存到本地磁盘上,再通过NimbusClient把topology的代码保存到本地,然后启动worker线程来执行任务,Demo中主要是执行一些拆分(split)和统计(count)作业。
6) SyncSupervisorEvent将自己的作业选出来,并保存到本地之后,再由SyncProcessEvent来启动worker执行具体的作业,SyncProcessEvent主要干两件事,启动新的worker,杀死无用的worker。当然,执行结果还要通过Ack机制向被订阅者返回,以保证task被成功执行。
版权声明:本文为博主原创文章,未经博主允许不得转载。