当前位置:网站首页 > 技术博客 > 正文

nimbus professional




  JStorm集群包含两类节点:主控节点(Nimbus)和工作节点(Supervisor)。其分别对应的角色如下:
  1. 主控节点(Nimbus)上运行Nimbus Daemon。Nimbus负责接收Client提交的Topology,分发代码,分配任务给工作节点,监控集群中运行任务的状态等工作。Nimbus作用类似于Hadoop中JobTracker。
  2. 工作节点(Supervisor)上运行Supervisor Daemon。Supervisor通过subscribe Zookeeper相关数据监听Nimbus分配过来任务,据此启动或停止Worker工作进程。每个Worker工作进程执行一个Topology任务的子集;单个Topology的任务由分布在多个工作节点上的Worker工作进程协同处理。




  Nimbus和Supervisor节点之间的协调工作通过Zookeeper实现。此外,Nimbus和Supervisor本身均为无状态进程,支持Fail FastJStorm集群节点的状态信息或存储在Zookeeper,或持久化到本地,这意味着即使Nimbus/Supervisor宕机,重启后即可继续工作。这个设计使得JStorm集群具有非常好的稳定性。

  前面介绍了JStorm中节点状态信息保存在Zookeeper里面,Nimbus通过向Zookeeper写状态信息分配任务,Supervisor通过从Zookeeper订阅相关数据领取任务,同时Supervisor也定期发送心跳信息到Zookeeper,使得Nimbus可以掌握整个JStorm集群的状态,从而可以进行任务调度或负载均衡。ZooKeeper使得整个JStorm集群十分健壮,任何节点宕机都不影响集群任务,只要重启节点即可。

  Zookeeper上存储的状态数据及Nimbus/Supervisor本地持久化数据涉及到的地方较多,详细介绍Nimbus之前就上述数据的存储结构简要说明如下(注:引用自[5]http://xumingming.sinaapp.com/)。

图1 JStorm存储在Zookeeper中数据说明

图2 Nimbus本地数据说明

图3 Supervisor本地数据说明
















  Nimbus做三件事情:
  1、接收Client提交Topology任务;
  2、任务调度;
  3、监控集群任务运行状况。







  前面已经提到,Nimbus通过向Zookeeper写数据完成任务分配,通过读Zookeeper上相关状态信息监控集群中任务的运行状态,所以与Nimbus直接发生交互仅Client和Zookeeper。如下图示。


  以jstorm-0.7.1为例,Nimbus相关实现在jstorm-server/src/main/java目录的com.alipay.dw.jstorm.daemon.nimbus包里。Nimbus Daemon的启动入口在NimbusServer.java。

1.Nimbus启动

Nimbus Daemon进程启动流程如下:
  1、根据配置文件初始化Context数据;
  2、与Zookeeper数据同步;
  3、初始化RPC服务处理类ServiceHandler;
  4、启动任务分配策略线程;
  5、启动Task的Heartbeat监控线程;
  6、启动RPC服务;
  7、其他初始化工作。
Nimbus的详细启动逻辑如下:






















  JStorm集群启动完成后,Client可向其提交Topology。jstorm-0.7.1源码目录jstorm-client/src/main/java下包backtype.storm为用户提供向集群提交Topology的StormSubmitter.submitTopology方法。提交Topology在Client/Nimbus两端都会做相关的处理。

Client端提交Topology分两步完成:
  1)打包Topology计算逻辑代码jar提交给Nimbus,上传到Nimbus目录$jstorm_local_dir/nimbus/inbox/stormjar-{$randomid}.jar;其中randomid是Nimbus生成的随机UUID;
  2)Client通过RPC向Nimbus提交Topology DAG及配置信息




  Nimbus端接收到Client提交上来的Topology计算逻辑代码jar包后如前面所述将jar包暂存在目录$jstorm_local_dir/nimbus/inbox/stormjar-{$randomid}.jar;
  Nimbus端接收到Client提交上来的Topology DAG和配置信息后:
   1)简单合法性检查;主要检查是否存在相同TopologyName的Topology,如果存在,拒绝Topology提交。
   2)生成topologyid;生成规则:TopologyName-counter-currenttime;
   3)序列化配置文件和Topology代码;
   4)Nimbus本地准备运行时所需数据;
   5)向Zookeeper注册Topology和Task;
   6)将Tasks压入分配队列等待TopologyAssign分配;



















  Topology被成功提交后会压入Nimbus中TopologyAssign的FIFO队列,后台任务调度线程对队列中的Topology逐个进行任务调度。
  从0.9.0开始,JStorm提供非常强大的调度功能,基本上可以满足大部分的需求,同时支持自定义任务调度策略。JStorm的资源不再仅是Worker的端口,而从CPU/Memory/Disk/Net等四个维度综合考虑。
  jstorm-0.7.1的任务调度策略仍主要以Worker端口/Net单一维度调度。




  任务调度需要解决的问题是:如何将Topology DAG中各个计算节点和集群资源匹配,才能发挥高效的逻辑处理。0.7.1的策略是:
    1、将集群中的资源排序:按照空闲worker数从小到大的顺序重排节点,节点内部按照端口大小顺序排列;
    2、Topology中需要分配的任务(重新分配的Topology时大多任务不再需要分配)逐个映射到上述排好序的资源里。
任务调度核心逻辑如下:







4.任务监控

  初始化Nimbus时后台会随之启动一个称为MonitorRunnable的线程,该线程的作用是定期检查所有运行Topology的任务Tasks是否存在Dead的状态。一旦发现Topology中存在Dead的任务Task,MonitorRunnable将该Topology置为StatusType.monitor,等待任务分配线程对该Topology中的Dead任务进行重新分配
MonitorRunnable线程默认10s执行一次检查,主要逻辑如下:

  本文简单介绍了Nimbus在整个JStorm系统中扮演的角色,及其实现逻辑和关键流程的源码剖析,希望能够对刚接触JStorm的同学有所帮助。文中难免存在不足和错误,欢迎交流指导。

[1]Storm社区. http://Storm.incubator.apache.org/
[2]JStorm源码. https://github.com/alibaba/jStorm/
[3]Storm源码. https://github.com/nathanmarz/Storm/
[4]Jonathan Leibiusky, Gabriel Eisbruch, etc. Getting Started with Storm.http://shop.oreilly.com/product/05.do. O’Reilly Media, Inc.
[5]Xumingming Blog. http://xumingming.sinaapp.com/
[6]量子恒道官方博客. http://blog.linezing.com/













版权声明


相关文章:

  • 动态规划背包问题算法分析2025-10-02 20:01:05
  • autoit v3 script2025-10-02 20:01:05
  • 应用层协议主要有哪些?2025-10-02 20:01:05
  • win10突然什么软件都打不开2025-10-02 20:01:05
  • c结构体初始化函数2025-10-02 20:01:05
  • libxml2使用2025-10-02 20:01:05
  • redis教程常用命令2025-10-02 20:01:05
  • verilog 移位运算符 说明2025-10-02 20:01:05
  • 空白数字符号2025-10-02 20:01:05
  • 极大似然算法2025-10-02 20:01:05