Storm 1.3 Storm的并发机制

Storm计算支持在多台机器上水平扩容,通过将计算切分为多个独立的tasks在集群上并发执行来实现。在Storm中,一个task可以简单地理解为在集群某结点上运行的一个spout或者bolt实例。
先来解释下载集群中运行的topology的四个主要组成部分:
1.Node(服务器):指配置在一个Storm集群中的服务器,会执行topology的一部分运算。一个Storm集群可以包括一个或者多个工作node。
2.Workers(JVM虚拟机):指一个node上相互独立运行的JVM进程。每个node可以配置运行一个或者多个worker。一个topology会分配到一个或多个worker上运行。
3.Executor(线程):指一个worker的jvm进程中运行的Java线程。多个task可以指派给同一个executor来执行。除非是明确指定,Storm默认会给每个executor分配一个task。
4.Task(bolt/spout实例):task是spout和bolt的实例,它们的nextTuple()和execute()方法会被executors线程调用执行。


一、WordCountTopology的并发机制
Storm的默认并发设置是1,除非明确制定。
假设我们有一台服务器(node),为topology分配了一个worker,并且每个executor执行一个task,我们的topology执行过程如下图所示:

如图所示,唯一的并发机制出现在线程级。每个任务在同一个JVM的不同线程中执行。如何增加并发度以充分利用硬件能力?我们来增加分配给topology的worker和executor的数量。


二、给topology增加worker
增加额外的worker是增加topology计算能力的简单方法。为此Storm提供了API和修改配置项两种修改方法。无论采取哪种方法,spout和bolt组件都不需要修改,可以直接复用。
在前面的单词计数topology中,我们引入了Config对象在发布时传递参数给submitTopology()方法,为了增加分配给一个topology的worker数量,只需要简单的调用一下Config对象的setNumWorkers()方法:
Config config = new Config();
config.setNumWorkers(2);
这样就给topology分配了两个worker而不是默认的一个。从而增加了topology的计算资源。我们还可以调整topology中的executor个数以及每个executor分配的task数量。


三、配置executor和task
Storm给topology中定义的每个组件建立一个task,默认情况下,每个task分配一个executor。Storm的并发机制API对此提供了控制方法,允许设定每个task对应的executor个数和每个executor可执行的task的个数。
在定义数据流分组时,可以设置给一个组件指派的executor的数量。如下代码,设置SentenceSpout并发为2个task,每个task指派各自的executor线程。
builder.setSpout(SENTENCE_SPOUT_ID, spout, 2);
如果只使用一个worker,topology的执行图如下图所示:


接下来,我们给语句分割bolt设置4个task和2个executor。每个executor线程指派2个task来执行:
builder.setBolt(SPLIT_BOLT_ID, splitBolt, 2).setNumTasks(4).shuffleGrouping(SENTENCE_SPOUT_ID);

我们给单词计数bolt设置4个task,每个task由一个executor执行:
builder.setBolt(COUNT_BOLT_ID, countBolt,2).fieldsGrouping(SPLIT_BOLT_ID, new Fields("word"));

在两个worker的情况下,topology执行过程如下图所示:


增加了topology并发后,运行更新过的WordCountTopology类,每个单词的计数比原topology要多。
Spout在topology关闭之前会一直发射数据,单词的计数值取决于计算机的速度,是否有其他程序在运行。总量上看,发射和处理的单词增多了。
当topology执行在本地模式时,增加worker的数量不会达到提高速度的效果。因为topology在本地模式下是在同一个JVM进程中执行的,所以只有增加task和executor的并发度配置才会生效。单程序在投入生产环境之前,必须在真实的集群环境下进行测试。


以上来自:

猜你喜欢

转载自margaret0071.iteye.com/blog/2360519