STORM_0009_Lifecycle-of-a-topology/拓扑的生命周期
- 真实运行的拓扑和用户声明的拓扑是不一样的,真实的拓扑包含隐含的流和隐含的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代码
- Nimbus在整个他的生命周期中都监视整个拓扑的状态。
- 调度经常性的任务给timer thread去检查拓扑
- Nimbus的行为表现为一个有限状态机
- 拓扑上的监视时间在每个“nimbus.monitor.freq.secs”被调用,这个通过reassign-transition调用reassign-topology
- reassign-topology调用mk-assignments,这个函数第一次也被用来分配拓扑。mk-assignments也有 能力增加更新拓扑。
- mk-assignments检查心跳分配任务
- 任何的重新分配改变zk中的状态的时候,会触发supervisor去同步,和启停workers。
- 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
STORM_0009_Lifecycle-of-a-topology/拓扑的生命周期的更多相关文章
- Storm概念学习系列之Topology拓扑
不多说,直接上干货! Hadoop 上运行的是 MapReduce 作业,而在 Storm 上运行的是拓扑 Topology,这两者之间是非常不同的.一个关键的区别是:一个MapReduce 作业 ...
- Envoy 代理中的请求的生命周期
Envoy 代理中的请求的生命周期 翻译自Envoy官方文档. 目录 Envoy 代理中的请求的生命周期 术语 网络拓扑 配置 高层架构 请求流 总览 1.Listener TCP连接的接收 2.监听 ...
- Elasticsearch索引生命周期管理方案
一.前言 在 Elasticsearch 的日常中,有很多如存储 系统日志.行为数据等方面的应用场景,这些场景的特点是数据量非常大,并且随着时间的增长 索引 的数量也会持续增长,然而这些场景基本上只有 ...
- k8s核心资源之namespace与pod污点容忍度生命周期进阶篇(四)
目录 1.命名空间namespace 1.1 什么是命名空间? 1.2 namespace应用场景 1.3 namespacs常用指令 1.4 namespace资源限额 2.标签 2.1 什么是标签 ...
- react组件的生命周期
写在前面: 阅读了多遍文章之后,自己总结了一个.一遍加强记忆,和日后回顾. 一.实例化(初始化) var Button = React.createClass({ getInitialState: f ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- C# MVC 5 - 生命周期(应用程序生命周期&请求生命周期)
本文是根据网上的文章总结的. 1.介绍 本文讨论ASP.Net MVC框架MVC的请求生命周期. MVC有两个生命周期,一为应用程序生命周期,二为请求生命周期. 2.应用程序生命周期 应用程序生命周期 ...
- UIViewController生命周期-完整版
一.UIViewController 的生命周期 下面带 (NSObject)的方法是NSObject提供的方法.其他的都是UIViewController 提供的方法. load (NSObje ...
- angular2系列教程(十一)路由嵌套、路由生命周期、matrix URL notation
今天我们要讲的是ng2的路由的第二部分,包括路由嵌套.路由生命周期等知识点. 例子 例子仍然是上节课的例子:
随机推荐
- centos rabbitmq
1. 安装erlang 安装依赖环境 yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unix ...
- overflow的劲爆知识点
1.属性 visible(默认) hidden(此处是隐藏不是裁剪) scroll(滚动条) auto(智能路线 当超出范围时则出现滚动条) inherit 不常用 存在兼容性问题 2.进入CSS3 ...
- 160829、Java加解密与数字签名
** Java加解密 ** 实现方式:JDK实现,CC,BC JDK提供比较基础的底层的实现:CC提供一些简化的操作:BC提供补充 一.Base64加密 非常简单,加密解密就一个函数. 代码如下: 二 ...
- Eclipse如何设置字体
Eclipse 是一个开放源代码的.基于Java的可扩展开发平台,是学习java和开发java最常用的IDE之一.有时候会遇到这种情况,刚刚下载了新的Eclipse,字体显示英文没问题,但是显示中文就 ...
- Windows驱动开发(中间层)
Windows驱动开发 一.前言 依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发. 二.初步环境 1.下载安装WDK7.1.0(WinDDK\7600.16385 ...
- Function对象属性和方法
/* var pattern = /^[\w]+\.(zip|rar|gz)$/; //|选择符必须用分组符号包含起来 var str = '123.7z'; alert(pattern.test(s ...
- [团队项目]SCRUM项目6.0 7.0 (新)
6.0----------------------------------------------------- sprint演示 1.坚持所有的sprint都结束于演示. 团队的成果得到认可,会感觉 ...
- ==与equal在java中应用的感悟
今天又算是长见识了.了解了下平时不注意的equal和==的区别. 不管是==又或是equal都是用来比较相同与否.当问题就在这里了,比较什么相同呢? 我的在日常的比较无非也就是两种:1.基本数据类型之 ...
- 算法心得2:关于k个最小和问题的思考
问题描述如下: 有k个整数数组,各包含k个元素.在每个数组中取一个元素加起来,可以得到k^k个和.求这些和中最小的k个值(重复计算的算多次). 如果同时考虑这k个数组的取值情况,其复杂程度不言而喻,并 ...
- 编译ITK
[2016年7月4周]编译ITK 1.下载必备文件 InsightToolkit-4.8.1.cmake 2.cmake编译 修改CMAKE_INSTALL_PREFIX配置到需要生成的目录下面去. ...