storm中的topology-worker-executor-task
- 调度角色
- 调度方法
- 自定义调度
1 调度角色
上图是JStorm中一个topology对应的任务执行结构,其中worker是进程,executor对应于线程,task对应着spout或者bolt组件。
1.1 Worker
Worker是task的容器, 同一个worker只会执行同一个topology相关的task。 一个topology可能会在一个或者多个worker(工作进程)里面执行,每个worker执行整个topology的一部分。比如,对于并行度是300的topology来说,如果我们使用50个工作进程来执行,那么每个工作进程会处理其中的6个tasks。Storm会尽量均匀的工作分配给所有的worker。
1.2 Executor
Executor是在worker中的执行线程,在同一类executor中,要么全部是同一个bolt类的task,要么全部是同一个spout类的task,需要注意的是, 一个executor只能同时运行一个task,创建时将多个task设置在一个executor中,在前期Storm中主要考虑的是后期线程扩展(待验证),但是在JStorm中可以在rebalance时改变Task的数量,所以不需要将task数量大于executor。
1.3 Task
Task是真正任务的执行者,对应创建topology时建立的一个bolt或者spout组件。每一个spout和bolt会被当作很多task在整个集群里执行。可以调用TopologyBuilder类的setSpout和setBolt来设置并行度(也就是有多少个task)。
2 调度方法
2.1 默认调度算法
默认调度算法遵循以下的原则:
- 任务调度算法以worker为维度,尽量将平均分配到各个supervisor上;
- 以worker为单位,确认worker与task数目大致的对应关系(注意在这之前已经其他拓扑占用利用的worker不再参与本次动作);
- 建立task-worker关系的优先级依次为:尽量避免同类task在同一work和supervisor下的情况,尽量保证task在worker和supervisor基准上平均分配,尽量保证有直接信息流传输的task在同一worker下。
- 调度过程中正在进行的调度动作不会对已发生的调度动作产生影响
2.2 调度示例
如下是一个topology创建时配置代码,以及运行时的示意图。
//创建topology配置代码
Config conf = new Config();
conf.setNumWorkers(2); // use two worker processes
topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2);
topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
.setNumTasks(4)
.shuffleGrouping("blue-spout");
topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6)
.shuffleGrouping("green-bolt");
StormSubmitter.submitTopology("mytopology", conf,
topologyBuilder.createTopology());
参考以上代码,以及任务调度算法,该拓扑中,设为worker为2,蓝色Spout并发设置为2,task默认与并发相同为2;绿色Bolt执行并发为2,但设置其task为4,所以每个executor中有两个Task,黄色Bolt并发为6,task默认与并发相同为6。
图中两个worker是一致的,可以认为是JStorm分配任务时做的权衡,尽量分配的均匀,不代表所有情况都是如此。
2.3 分发过程
上图是storm的示例,JStorm雷同。
JStorm任务分发过程:
- 客户端提交拓扑到nimbus,并开始执行;
- Nimbus针对该拓扑建立本地的目录,根据topology的配置计算task,分配task,在zookeeper上建立assignments节点存储task和supervisor机器节点中woker的对应关系;
- 在zookeeper上创建taskbeats节点来监控task的心跳;启动topology。
- 各Supervisor去zookeeper上获取分配的tasks,启动多个woker进行,每个woker生成task;根据topology信息初始化建立task之间的连接。
使用ack机制需要注意是的:
spout发送数据时需要指定msgID,中间的bolt在emit数据的时候需要传递tuple,否则当下游的bolt失败后,不会触发spout的fail
collector.ack与collector.fail的位置一定不要乱放,否则很可能不执行spout的fail方法
如果ack放在emit之前,或者在调用fail之后,程序还有机会调用到ack,那么就会结束jstorm的ack线程,告诉整个topology,此任务已结束,并处理成功。
https://blog.csdn.net/wwwxxdddx/article/details/49977697
storm中的topology-worker-executor-task的更多相关文章
- Storm中-Worker Executor Task的关系
Storm在集群上运行一个Topology时,主要通过以下3个实体来完成Topology的执行工作:1. Worker(进程)2. Executor(线程)3. Task 下图简要描述了这3者之间的关 ...
- Storm概念学习系列之Worker、Task、Executor三者之间的关系
不多说,直接上干货! Worker.Task.Executor三者之间的关系 Storm集群中的一个物理节点启动一个或者多个Worker进程,集群的Topology都是通过这些Worker进程运行的. ...
- Storm中关于Topology的设计
一:介绍Storm设计模型 1.Topology Storm对任务的抽象,其实 就是将实时数据分析任务 分解为 不同的阶段 点: 计算组件 Spout Bolt 边: 数据流向 数据从上 ...
- Storm概念学习系列之核心概念(Tuple、Spout、Blot、Stream、Stream Grouping、Worker、Task、Executor、Topology)(博主推荐)
不多说,直接上干货! 以下都是非常重要的storm概念知识. (Tuple元组数据载体 .Spout数据源.Blot消息处理者.Stream消息流 和 Stream Grouping 消息流组.Wor ...
- storm源码之理解Storm中Worker、Executor、Task关系 + 并发度详解
本文导读: 1 Worker.Executor.task详解 2 配置拓扑的并发度 3 拓扑示例 4 动态配置拓扑并发度 Worker.Executor.Task详解: Storm在集群上运行一个To ...
- 【原】storm源码之理解Storm中Worker、Executor、Task关系
Storm在集群上运行一个Topology时,主要通过以下3个实体来完成Topology的执行工作:1. Worker(进程)2. Executor(线程)3. Task 下图简要描述了这3者之间的关 ...
- storm中worker、executor、task之间的关系
这里做一些补充: worker是一个进程,由supervisor启动,并只负责处理一个topology,所以不会同时处理多个topology. executor是一个线程,由worker启动,是运行t ...
- 关于Storm 中Topology的并发度的理解
来自:https://storm.apache.org/documentation/Understanding-the-parallelism-of-a-Storm-topology.html htt ...
- Storm官方文档翻译之在生产环境集群中运行Topology
在进群生产环境下运行Topology和在本地模式下运行非常相似.下面是步骤: 1.定义Topology(如果使用Java开发语言,则使用TopologyBuilder来创建) 2.使用StormSub ...
- Twitter Storm中Topology的状态
Twitter Storm中Topology的状态 状态转换如下,Topology 的持久化状态包括: active, inactive, killed, rebalancing 四个状态. 代码上看 ...
随机推荐
- SSH 整合时报内存溢出 缓存无法释放
简单点讲, 我的问题就是jar包一样, 但版本不一样, 还有重复的jar导入了, 导致了这个问题, 别人的我不知道, 问题知道了, 答案也就有了, 是重复加载的问题, 删掉重复的就好了.
- Robot Framework基础学习(五)
Selenium2Library 常用关键字介绍 关于Selenium2Library 的关键字,我们可以参考:http://rtomac.github.io/robotframework-selen ...
- 一步步实现 Prism + MEF(一)--- 搭建框架
第一步:构建一个名为Bootstrapper的类作为引导程序. class Bootstrapper : MefBootstrapper { } 第二步:在MainWindow窗体中添加一个Coont ...
- 《Java多线程编程核心技术》读后感(十)
一生产一消费:操作栈 本实例是使生产者向堆栈List对象中放入数据,使消费者从List堆栈中取出数据.List最大容量是1 package Third; import java.util.ArrayL ...
- SSE优化指令集编译错误: inlining failed in call to always_inline 'xxx': target specific option mismatch xxx
在用QtCreator编译SSE优化指令的时候,出现了如下错误, inlining failed in call to always_inline '__m128i _mm_packus_epi32( ...
- win10怎样彻底关闭windows Defender
首先,我们在电脑中需要进入注册表编辑器进行修改,win10电脑进入windows Defender可以有两种方式,第一种是通过电脑自带的小娜进入,第二种则是常规的win加r. 不管使用哪种方式,首 ...
- 如何阻止冒泡&&浏览器默认行为
摘要 很多同学对阻止事件冒泡和阻止事件默认行为容易混淆,项目中因为一些原因也需要阻止浏览器的一些默认行为,这里就简单总结一下. 阻止事件冒泡 什么是事件冒泡这里就不再赘述了,网上的文章一大把,这里就简 ...
- 从头开始学Web开发—CSS_01
CSS导入使用及引用的两种方法: 外部引用 外部引用的方式,我们直接可以通过link标签来引用我们写好的一个CSS文件: 在link 标签中,我们通过rel = "stylesheet&qu ...
- Python基础(四)——迭代器/对象,生成器
首先廖雪峰网站写的内容就我目前初步学习来说,已经相当详实,知识点平铺直叙让人易接受,所以以下内容均作为一种摘记记录以及补充. 1. 列表生成器 主要目的是创建 list .多看例子就能清楚: #列表生 ...
- MYSQL limit,offset 区别(转)
SELECT keyword FROM keyword_rank WHERE advertiserid='59' order by keyword LIMIT 2 OFFSET 1; 比如这个SQL ...