TopologyMaster:

处理拓扑的一些基本信息和工作,比如更新心跳信息,拓扑指标信息更新等
 
NimbusServer:
**
*
* NimbusServer work flow: 1. cleanup interrupted topology delete /storm-local-dir/nimbus/topologyid/stormdis delete /storm-zk-root/storms/topologyid
*
* 2. set /storm-zk-root/storms/topology stats as run
*
* 3. start one thread, every nimbus.monitor.reeq.secs set /storm-zk-root/storms/ all topology as monitor. when the topology's status is monitor, nimubs would
* reassign workers 4. start one threa, every nimubs.cleanup.inbox.freq.secs cleanup useless jar
*
* @author version 1: Nathan Marz version 2: Lixin/Chenjun version 3: Longda
*
*/
 
Nimbus在启动时先去读取配置文件,然后初始化follower线程,每个follower分别到zk注册,在Znode下创建临时节点记录已启动的时间,另外一个节点在初始化线程时,先后调用两个方法:(FollowerRunnable.java)
data.getStormClusterState().update_nimbus_slave(hostPort, data.uptime());
data.getStormClusterState().update_nimbus_detail(hostPort, null);
然后Nimbus会判断集群是否已经存在leader,如果不存在则经历一次选举过程,如果有,则去检查leader的配置并同步,过程可以参照笔记stormNimbus集群
在启动nimbus前初始化,初始化(NimbusServer.init())
1、清理一些中断了的topology(nimbus目录下/storm.local.dir/stormdist下存在,zk中storms/topologyid中不存在的topology): 删除ZK上相关信息(清理tasks/topologyid; storms/topologyid; assignments/topologyid这个三个目录)。
2、初始化任务分派会启动一个后台线程:TopologyAssign,下面分析一下这个后台线程怎样分配任务的:(doTopologyAssignment)
1、创建一个任务调度器(DefaultTopologyScheduler)
2、创建任务,将配置和topology的信息初始化TopologyAssignEvent,用默认的任务调度器指派任务(DefaultTopologyScheduler.assignTasks)
3、通过初始化过的TopologyAssignEvent初始化上下文(TopologyAssignContext context = prepareTopologyAssign(event) 
4、在prepareTopologyAssign方法中,获取当前所有在运行的supervisor                                             *****!!!!!非常重要的方法,深入研究
4、 指派任务时,先根据任务分派类型(Rebalance/new/monitor)判断需要处理的task: (TopologyAssign)
如果是new类型,则将context中缓存的所有task都加入任务列表;
如果是rebalance,将所有不在运行的task加入任务列表
如果是monitor,将所有死掉task加入任务列表
5、任务列表初始化成功后,获取topology节点的配置信息,然后在zk上创建节点,存放superVisor和对应host信息,worker信息等
因为所有的指令通过thrift的回调都通过ServiceHandler,当调用submitTopology时,会真正调用到submitTopologyWithOpts,代码逻辑基于thrift的框架开发
thread.setName("TopologyAssign");
thread.setDaemon(true);
thread.start();
分析一下submitTopologyWithOpts的执行过程和逻辑:
 
如果在pendingSubmitTopologys的队列中有同名的topology,则抛异常
// create /local-dir/nimbus/topologyId/xxxx files
setupStormCode(conf, topologyId, uploadedJarLocation, stormConf, normalizedTopology); // generate TaskInfo for every bolt or spout in ZK
// /ZK/tasks/topoologyId/xxx
setupZkTaskInfo(conf, topologyId, stormClusterState); // make assignments for a topology
LOG.info("Submit for " + topologyName + " with conf " + serializedConf);
makeAssignment(topologyName, topologyId, options.get_initial_status()); // when make assignment for a topology,so remove the topologyid form
// pendingSubmitTopologys
data.getPendingSubmitTopologys().remove(topologyId); // push start event after startup
StartTopologyEvent startEvent = new StartTopologyEvent();
this.data.getMetricRunnable().pushEvent(startEvent);
notifyTopologyActionListener(topologyName, "submitTopology");
将startEvent添加到队列之后,触发submitTopology的action. 
 
private void init(Map conf) throws Exception {

    NimbusUtils.cleanupCorruptTopologies(data);

    initTopologyAssign();

    initTopologyStatus();

    initCleaner(conf);

    serviceHandler = new ServiceHandler(data);

    if (!data.isLocalMode()) {

       //data.startMetricThreads();

        initMonitor(conf);

        initThrift(conf);

    }
}
 
Supervisor:
* Supevisor workflow 1. write SupervisorInfo to ZK
*
* 2. Every 10 seconds run SynchronizeSupervisor 2.1 download new topology 2.2 release useless worker 2.3 assgin new task to /local-dir/supervisor/localstate
* 2.4 add one syncProcesses event
*
* 3. Every supervisor.monitor.frequency.secs run SyncProcesses 3.1 kill useless worker 3.2 start new worker
*
* 4. create heartbeat thread every supervisor.heartbeat.frequency.secs, write SupervisorInfo to ZK
1、supervisor清空临时目录和文件等,然后创建心跳对象,将supervisor_id,ip,端口等更新到心跳对象,然后调用update方法在zookeep上创建临时节点,用以保存supervisor的信息,在zk上注册完成后,创建supervisor的同步线程,同步线程中创建worker
supervisor启动worker过程:
主要类: SyncProcessEvent
public void run(Map<Integer, LocalAssignment> localAssignments, Set<String> downloadFailedTopologyIds) {
LOG.debug("Syncing processes, interval seconds:" + TimeUtils.time_delta(lastTime));
lastTime = TimeUtils.current_time_secs();
try { /**
* Step 1: get assigned tasks from localstat Map<port(type Integer), LocalAssignment>
*/
if (localAssignments == null) {
localAssignments = new HashMap<>();
}
LOG.debug("Assigned tasks: " + localAssignments); /**
* Step 2: get local WorkerStats from local_dir/worker/ids/heartbeat Map<workerid [WorkerHeartbeat, state]>
*/
Map<String, StateHeartbeat> localWorkerStats;
try {
localWorkerStats = getLocalWorkerStats(conf, localState, localAssignments);
} catch (Exception e) {
LOG.error("Failed to get Local worker stats");
throw e;
}
LOG.debug("Allocated: " + localWorkerStats); /**
* Step 3: kill Invalid Workers and remove killed worker from localWorkerStats
*/
Map<String, Integer> taskCleaupTimeoutMap;
Set<Integer> keepPorts = null;
try {
taskCleaupTimeoutMap = (Map<String, Integer>) localState.get(Common.LS_TASK_CLEANUP_TIMEOUT);
keepPorts = killUselessWorkers(localWorkerStats, localAssignments, taskCleaupTimeoutMap);
localState.put(Common.LS_TASK_CLEANUP_TIMEOUT, taskCleaupTimeoutMap);
} catch (IOException e) {
LOG.error("Failed to kill workers", e);
} // check new workers
checkNewWorkers(conf); // check which topology need update
checkNeedUpdateTopologys(localWorkerStats, localAssignments); // start new workers
startNewWorkers(keepPorts, localAssignments, downloadFailedTopologyIds); } catch (Exception e) {
LOG.error("Failed Sync Process", e);
// throw e
} }
 
TopologySubmitter:

storm启动过程之源码分析的更多相关文章

  1. Flink的Job启动TaskManager端(源码分析)

    前面说到了  Flink的JobManager启动(源码分析)  启动了TaskManager 然后  Flink的Job启动JobManager端(源码分析)  说到JobManager会将转化得到 ...

  2. Android Activity Deeplink启动来源获取源码分析

    一.前言 目前有很多的业务模块提供了Deeplink服务,Deeplink简单来说就是对外部应用提供入口. 针对不同的跳入类型,app可能会选择提供不一致的服务,这个时候就需要对外部跳入的应用进行区分 ...

  3. sentinel流量控制和熔断降级执行流程之源码分析

    前言: sentinel是阿里针对服务流量控制.熔断降级的框架,如何使用官方都有很详细的文档,下载它的源码包 里面对各大主流框都做了适配按理,本系列文章目的 主要通过源码分析sentinel流量控制和 ...

  4. spring mvc 启动过程及源码分析

    由于公司开源框架选用的spring+spring mvc + mybatis.使用这些框架,网上都有现成的案例:需要那些配置文件.每种类型的配置文件的节点该如何书写等等.如果只是需要项目能够跑起来,只 ...

  5. Flink的Job启动JobManager端(源码分析)

    通过前面的文章了解到 Driver将用户代码转换成streamGraph再转换成Jobgraph后向Jobmanager端提交 JobManager启动以后会在Dispatcher.java起来RPC ...

  6. Netty服务端启动过程相关源码分析

    1.Netty 是怎么创建服务端Channel的呢? 我们在使用ServerBootstrap.bind(端口)方法时,最终调用其父类AbstractBootstrap中的doBind方法,相关源码如 ...

  7. ASP.Net Core MVC6 RC2 启动过程分析[偏源码分析]

    入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢? .NET Web Development and Tools Blog ASP.NE ...

  8. Flink的Job启动Driver端(源码分析)

    整个Flink的Job启动是通过在Driver端通过用户的Envirement的execute()方法将用户的算子转化成StreamGraph,然后得到JobGraph通过远程RPC将这个JobGra ...

  9. supervisor启动worker源码分析-worker.clj

    supervisor通过调用sync-processes函数来启动worker,关于sync-processes函数的详细分析请参见"storm启动supervisor源码分析-superv ...

随机推荐

  1. js设计模式总结-策略模式

    策略模式 要解决的问题 当解决一个问题有多种方法时,选择使用哪种方法时就少不了要用大量的if语句进行判断,如果将这些方法的实现和判断语句放在一起实现就会产生问题, 比如增加一种的新的方法时,就不得不再 ...

  2. jsp发布:tomcat+花生壳

    1.tomcat/conf/server.xml <Host name="localhost" appBase="webapps" unpackWARs= ...

  3. Thread.join()方法

    thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B.t.join() ...

  4. vc6.0如何显示行号以及出现版本不兼容问题

    有时编译时,提示某某行有错,但是要定位到某一行的话,如果在编辑页面能够将行号显示出来,查找也就更方便了,下面我来介绍一下让VC6.0显示行号的方法.   工具/原料   VC6.0.显示行号的插件 方 ...

  5. Wiki介绍

    Wiki是一种高效的知识管理系统. 我们可以使用wiki构建自己的个人知识管理系统.

  6. mybatis原理

    http://blog.csdn.net/column/details/mybatis-principle.html?page=1

  7. linux centos 安装mysql

    安装步骤 http://www.cnblogs.com/gaojupeng/p/5727069.html 下面这个报错 主要还是在 题啊加软连接的   命令出了问题 1.启动  报错 mysqld_s ...

  8. HTTP 源码解读

    作用域:调用函数,访问变量的能力有关 作用域分为:局部和全局(在局部作用域里可以访问到全局作用域的变量,但在局部作用域外面就访问不到局部作用里面所设定的变量) 上下文:与this关键字有关 是调用当前 ...

  9. 《高级Web应用程序设计》课程

    一.课堂课件 全部授课内容 二.作业 访问ftp://192.168.42.254:22,登录后找到自己的姓名文件夹,放入作业即可.登录账号为stu1,密码为空. 已布置练习 练习1(截止日期10月1 ...

  10. 几款极好的 JavaScript 文件上传插件

    文件上传功能作为网页重要的组成部分,几乎无处不在,从简单的单个文件上传到复杂的批量上传.拖放上传,需要开发者花费大量的时间和精力去处理,以期实现好用的上传功能.这篇文章向大家推荐几款很棒的 JavaS ...