理解Storm并发
来源:互联网 发布:天行健网络 编辑:程序博客网 时间:2024/06/06 15:43
原文:http://www.cnblogs.com/Jack47/p/understanding_the_parallelism_of_a_storm_topology.html
注:本文主要内容翻译自understanding-the-parallelism-of-a-storm-topology
本篇文章介绍了Storm拓扑的并发模型。介绍了Worker进程,Executor(线程)和Task(任务)之间的关系,如何按照需要配置他们。本文基于Storm 0.8.1版本,最新发布版本已经到了0.9.5了。
对于不了解Storm的朋友,可以先去看看Storm介绍(一)。
拓扑的组成部分
在Storm集群上运行的拓扑主要包含以下的三个实体:
- Worker进程
- Executors
- Tasks(任务)
下图简单阐释了他们之间的关系:
图1:Storm中worker进程,executor(线程)和任务的关系
一个正在运行的拓扑由很多worker进程组成,这些worker进程在Storm集群的多台机器上运行。一个worker进程属于一个特定的拓扑并且执行这个拓扑的一个或多个component(spout或者bolt)的一个或多个executor。一个worker进程就是一个Java虚拟机(JVM),它执行一个拓扑的一个子集。
一个executor是由一个worker进程产生的一个线程,它运行在worker的Java虚拟机里。一个executor为同一个component(spout或bolt)运行一个或多个任务。一个executor总会有一个线程来运行executor所有的task,这说明task在executor内部是串行执行的。
真正的数据处理逻辑是在task里执行的,在父executor线程执行过程中会运行task。在代码中实现的每个spout或bolt是在全集群中以很多task的形式运行的。一个component的task数量在这个拓扑的生命周期中是固定不变的,但是一个component的executor(线程)数量会随着时间推移发生变化。这说明以下条件一直成立:threads数量 <= task数量
。默认情况下task数量被设置成跟executor的数量是一样的,即Storm会在每个线程上执行一个任务(这通常是你想要的)。
同时请注意:
- executor线程的数量在拓扑已经启动后,可以发生变化(见下面的
storm rebalance
命令)。 - 拓扑的task数量是固定的
可以看“理解Storm内部的消息缓存”来从另外一个视角来看一个worker进程生命周期中运行的各种各样的线程和跟这些线程关联的executor和task。
配置拓扑的并发度
注意Storm术语中“并发度(parallelism)“特定地用来描述所谓的"parallelism hint",它代表了一个component初始的executor(线程)数量。但在这篇文章中我使用更广泛意义的“并发度“来描述如何配置一个Storm拓扑中executor数量,worker进程数量以及task数量。当使用Storm中狭义的“并发度”时,我会特殊说明。
下表是各种配置项的概述以及如何在代码中设置。有不止一种方法来设置这些选项,但是下表只列出了其中一些方法。Storm目前配置项的优先级是:外部component特定的配置>内部component特定的配置项>拓扑特定的配置项>storm.yaml>defaults.yaml。更多详情可以参阅Storm文档。
下面是一段如何实际设置这些配置的示例性代码:
topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2).setNumTasks(4).shuffleGrouping("blue-spout");
在上述代码中我们配置Storm以两个executor和4个task的初始数量去运行greenBolt
。Storm会在每个executor(线程)上运行两个任务。如果你没有显示配置任务的数量,Storm会默认每个executor运行一个任务。
在多租户的Storm集群上配置并发
在Storm 0.8.2中引入了隔离调度器,让多个拓扑很容易且安全地共享一个集群,例如,它解决了多租户的问题--避免多个拓扑之间的资源竞争--通过提供拓扑间的完全隔离
当使用隔离调度器的时候Nathan[Storm作者]建议你把worker数量设置成机器数量的倍数。把executor数量设置成worker数量的倍数。如果你会调用
setNumTasks()
(多数人不会),应该设置成executor数量的倍数。这样做了之后,你的拓扑的负载就会均匀分布。每台机器和每个Java虚拟机进程会有相同数量的线程和大致等量的负载。Jason Jackson。
运行中的Storm拓扑的例子
下图阐释了在实际中一个简单拓扑看起来长什么样子。拓扑包含三个组件(component):一个叫BlueSpout
的Spout
,两个分别叫做GreenBolt
和YellowBolt
的Bolt
。组件相互连接而构成一个图结构:BlueSpout
把输出发送给GreenBolt
,同样GreenBolt
把结果发送给YellowBolt
。
运行中拓扑的例子
还记得上面展示的配置GreenBolt
代码吗?BlueSpout
和YellowBolt
只设置了parallelism_hint
(executor数量)。下面是相关代码:
Config conf = new Config(); conf.setNumWorkers(2); // use two worker processes topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); // parallelism hint topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2).setNumTasks(4).shuffleGrouping("blue-spout"); topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6).shuffleGrouping("green-bolt"); StormSubmitter.submitToplogy("mytopology", conf, topologyBuilder.createTopology());
改变正在运行拓扑的并发度
Storm一个灵巧的功能是可以增减worker进程或者executor的数量而不需要重启集群或者拓扑。这种做法叫做rebalancing
。
有两种方法可以用来做拓扑的rebalance
:
- 使用Storm web UI来做
- 使用下面介绍的命令行工具
storm rebalance
命令行的例子:
# 重新配置“mytopology”拓扑使用5个worker进程[原来是2个]# "blue-spout"这个spout使用3个[原来有2个]executor# "yellow-bolt"使用10个[原来有6个]executor$ storm rebalance mytopology -n 5 -e blue-spout=3 -e yellow-bolt=10
留给读者的问题
经过上面的rebalance
命令,此时每个Bolt各自有几个executor,几个task,每个worker里面分配了几个executor?
参考资料
Storm文档
Storm介绍(一)
Storm教程
- Storm并发度理解
- 理解Storm并发
- 理解Storm中的拓扑的并发度
- 理解Storm Topology的并发机制
- Storm 中Topology的并发度的理解 (1)
- Storm 中Topology的并发度的理解 (2)
- 关于Storm 中Topology的并发度的理解<转>
- 对storm中Topology的并发度理解
- 【Storm总结-2】关于Storm 中Topology的并发度的理解
- 【Storm总结-2】关于Storm 中Topology的并发度的理解<转>
- 【Storm总结-2】关于Storm 中Topology的并发度的理解
- storm理解
- storm的并发
- storm的并发
- Storm并发度详解
- storm的并发
- Storm并发机制详解
- storm 并发度
- 【框架整合】四、整合redis
- 【Tomcat9源码分析】请求过程概述
- Mybatis学习使用(一) —— 增删查改
- 让linux每天定时备份MySQL数据库并删除五天前的备份文件
- Android快速获取当前Activity类名的三种方法
- 理解Storm并发
- AOJ 0118 Property Distribution 【DFS】
- shoutcast 数据获取
- 原生JS实现简单抽人名功能实例
- setInterval,setTimeout
- OSI分层,TCP/IP分层
- HDU5519-数位DP或者FFT
- 徇私舞弊不移交刑事案件罪
- yum制作(笔记)