STORM_0009_Lifecycle-of-a-topology/拓扑的生命周期

http://storm.apache.org/releases/1.0.1/Lifecycle-of-a-topology.html

STORM拓扑的生命周期

本页的内容基于0.7.1代码,后来又很多的变化了。

详细解释了一个拓扑的生命周期: 从提交拓扑,到supervisor启停workers

也解释了Nimbus怎么监视拓扑和拓扑在被killed的时候是怎么关闭的

首先是两个说明

  • 真实运行的拓扑和用户声明的拓扑是不一样的,真实的拓扑包含隐含的流和隐含的acker bolt去管理acking 框架(保证了数据的处理),这个隐含的拓扑是通过system-topology!函数实现的
  • storm-topology!函数在两个地方被使用
    • 当Nimbus为拓扑创建任务的时候
    • 在worker中,使得它知道何时路由信息

Starting a topology

  • storm jar这个命令用特定的参数去执行你的类,这个命令执行的唯一的特别的事情是设置storm.jar环境变量,为StormSubmitter后来的使用做准备
  • 当使用StromSubmitter.submitTopology的时候,StormSubmitter会执行下面的行动
    • 首先:如果以前没上传jar会首先上传jar
    • 通过Nimbus的Thrift接口Jar上传完成了
    • beginFileUpload返回一个Nimbus的inbox的路径
    • 15kb 一次上传 通过uploadChunk
    • finishFileUpload被调用, 当上传完成的时候
    • 这是Thrift的方法实现的Nimbus
    • 其次:在Nimbus thrift interface上StormSubmitter调用submitTopology
    • 拓扑的配置被JSON序列化了
    • 注意Thrift的submitTopology调用需要Nimbus的inbox路径(就是jar上传的路径)
  • Nimbus收到了拓扑的提交
  • Nimbus规范了拓扑的配置,目的是使得确保每一个任务都有一个相同的序列化注册,这对于序列化工作的正确的执行至关重要。
  • Nimbus为拓扑设置静态状态
    • Jar包和配置都在本地放着,因为这些文件对于zookeeper来说太大,这些文件被拷贝到{Nimbus local dir}/stormdist/{topology id}
    • setup-storm-static写任务-组件映射到ZK
    • setup-heartbeats创建ZK目录,在目录中任务可以heartbeat
  • Nimbus调用mk-assignment给机器分配任务
    • 任务包含:
      • master-code-dir:被supervisor使用去下载正确的jars/configs
      • task->node+port:一个从任务id到运行它的worker节点的映射
      • node->host:从node id到host的映射,使得workers知道和哪个机器去连接实现和其他worker的通信。node id被用来id supervisor,这样多个supervisor可以运行在一个机器上。
      • task->start-time-secs:包含一个任务和一个nimbus开始任务的时间戳的映射。这被nimbus使用来监视拓扑。
  • 一旦拓扑被指派,它们就初始化为一个不激活的状态。start-storm写数据到Zookeeper使得cluster知道拓扑被激活了,可以从spout发射tuples。
  • TODO集群状态图表
  • Supervisor在后台运行两个函数
    • synchronize-supervisor:这个在zookeeper中的任务改变的时候被调用,平时也是每十秒钟调用一次。
      • 对于没有代码的机器,从nimbus给他们下载代码
      • 将这个节点应当运行什么:port->LocalAssignment写到文件系统。其中LocalAssignment包含一个拓扑id也包含workers的task id列表
    • sync-processes:从本地文件系统读取上一个函数写入的东西,和实际运行着的东西对比。然后必要情况下启停worker进程实现同步。
  • worker进程通过mk-worker函数启动
    • worker连接另外的worker,并且启动一个线程去 监视变化。如果一个worker得到了重新分配,这个worker就会重连其他的worker的新的状态。
    • 监视无论这个拓扑时候是活着的,并且将这个状态存储在storm-active-atom变量中。这个变量被任务用来去决定调用不调用spout的nextTuple方法。
    • worker启动多线程处理多任务
  • 任务通过mk-task函数设置
    • 任务设置路径函数,函数中传入一个流和一个输出tuple并且返回一个任务列表发送给tuple。
    • 任务设置spout-specific或者bolt-specific代码

Topology Monitoring

  • Nimbus在整个他的生命周期中都监视整个拓扑的状态。
    • 调度经常性的任务给timer thread去检查拓扑
    • Nimbus的行为表现为一个有限状态机
    • 拓扑上的监视时间在每个“nimbus.monitor.freq.secs”被调用,这个通过reassign-transition调用reassign-topology
    • reassign-topology调用mk-assignments,这个函数第一次也被用来分配拓扑。mk-assignments也有 能力增加更新拓扑。
      • mk-assignments检查心跳分配任务
      • 任何的重新分配改变zk中的状态的时候,会触发supervisor去同步,和启停workers。

Killing a topology

  • storm kill这个命令将会调用Nimbus Thrift接口去听着一个拓扑
  • nimbus接收这个kill
  • nimbus执行这个kill过度
  • 这个kill过度函数转换拓扑为killed状态,并且转换remove的事件为wait time seconds
    • 这个time默认就是timeout但是可以被Kill -w的命令重写
    • 导致拓扑被停止,在真实关闭的等待时间给拓扑一个机会在关闭workers之前处理正在处理的事情
    • 在Kill 事务中改变状态保证kill协议对Nimbus崩溃 是可以容忍的,一旦启动,如果拓扑的状态是killed,Nimbus调度移除事件运行wait time seconds。
  • 移除拓扑,清理任务和zk中的静态信息
  • 独立的清理线程运行do-cleanup函数,将会清理本地的heartbeat dir和jars/config
时间: 2024-08-03 03:11:50

STORM_0009_Lifecycle-of-a-topology/拓扑的生命周期的相关文章

iOS程序执行顺序和UIViewController 的生命周期(整理)

说明:此文是自己的总结笔记,主要参考: iOS程序的启动执行顺序 AppDelegate 及 UIViewController 的生命周期 UIView的生命周期 言叶之庭.jpeg 一. iOS程序的启动执行顺序 程序启动顺序图 iOS启动原理图.png 具体执行流程 程序入口进入main函数,设置AppDelegate称为函数的代理 程序完成加载[AppDelegate application:didFinishLaunchingWithOptions:] 创建window窗口 程序被激活[

android Activity 的生命周期 以及横屏竖屏切换时 Activity 的状态变化

生命周期Android 系统在Activity 生命周期中加入一些钩子,我们可以在这些系统预留的钩子中做一些事情.例举了 7 个常用的钩子:protected void onCreate(Bundle savedInstanceState)protected void onStart()protected void onResume()protected void onPause()protected void onStop()protected void onRestart()protecte

连载《一个程序猿的生命周期》-《发展篇》- 12.向生活妥协的选择之路,你也面临吗?

本篇文章的主角是第二个加入我们团队的,暂且称他为G兄.是我第二家公司的同事,但是当时并没有交集,后来经过其他同事说起,被我招过来的.关于第二家公司的情况,请参见<而立之年,第一次跳槽,寻求转型> 在加入我们团队之前,G兄在一个不大不小的公司做内部OA系统,众所周知不会有什么太大发展,他当时也不太满意.在和他交流的过程中,我说的很直接:1.开发公司内部OA,并非公司实际产品,无法直接创造利润,就算是公司的产品,现在做OA的多了去了.2.OA开发完成后,只剩运维人员,假设裁掉一部分人员的话,你怎么

【Vue】详解Vue生命周期

Vue实例的生命周期全过程(图) (这里的红边圆角矩形内的都是对应的Vue实例的钩子函数) 在beforeCreate和created钩子函数间的生命周期 在beforeCreate和created之间,进行数据观测(data observer) ,也就是在这个时候开始监控data中的数据变化了,同时初始化事件 created钩子函数和beforeMount间的生命周期 对于created钩子函数和beforeMount间可能会让人感到有些迷惑,下面我就来解释一下: el选项的有无对生命周期过程

vue 生命周期初探

vue 以后发之势加上其独有的特性(压缩后很小),轻量级的MVVM框架,目前github star已有5.94万,而react 7万.由此可见是两个非常热门前端框架.这里就vue的生命周期做个初步体验. 发现看视频,动手之后,过段时间还是会忘,所以写一篇短文以备不时之需. 先附上官网的图片:vue生命周期 生命周期的钩子函数如果使用得当,会大大增加开发效率: 生命周期实践: 为了更好的查看beforeUpdate.updated,beforeDestroy,destroy钩子函数,使用v-on绑

1.2软件生命周期&amp;测试流程

软件的生命周期 可行性分析-需求分析-软件设计-软件编码-软件测试-软件维护 1.可行性分析 主要确定软件开发的目的和可行性(PM) 2.需求分析 对软件的功能进行详细的分析(PM),输出需求规格说明书(原型图) 3.软件设计(DEV) 把需求分析得到的结果转换为软件结构和数据结构,形成系统架构 概要设计:搭建架构.模块功能.接口连接和数据传输 详细设计:模块深入分析,对各模块组合进行分析,伪代码   包含数据库设计说明 4.软件编码(DEV) 可运行的程序代码 5.软件测试 5.1.单元测试(

ASP.NET页面生命周期与控件生命周期

ASP.NET页面生命周期 (1)PreInit 预初始化(2)Init 初始化(3)InitComplete 初始化完成(4)PreLoad 预加载(5)Load 加载(6)LoadComplete 加载完成(7)PreRender 预输出(8)PreRenderComplete 预输出完成(9)Unload 卸载 ASP.NET控件生命周期 -- 实例化(Instantiate) 控件被页面或另一个控件通过调用它的构造器所实例化.这个步骤之后所列出的阶段,仅当控件加入控件树中才会发生. --

Servlet简介与生命周期

转载请注明原文地址: 一:Servlet是什么 Servlet是运行在Web服务器上的Java程序,作为处理来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层.JSP在web服务器上要先转换成servlet,然后才能在JVM运行,并把结果拼接成浏览器可识别的文件(如html)传回浏览器显示. 二:Servlet的应用场景 单纯地对客户端的请求做处理时,如果我们用纯JSP文件(即:只有Java语句)来处理的话,还需要先转换为servlet才能运行

Servlet的生命周期

Servlet的生命周期是由Servlet的容器来控制的,它可以分为三个阶段:初始化.运行.销毁1.初始化阶段:(1)Servlet容器加载Servlet类,把Servlet类的.class文件中数据读到内存中:(2)然后Servlet容器创建一个ServletConfig对象.ServletConfig对象包含了Servlet的初始化配置信息:(3)Servlet容器创建一个Servlet对象:(4)Servlet容器调用Servlet对象的init方法进行初始化.2.运行阶段当Servlet