Storm集群中执行的各种组件及其并行

一、Storm中执行的组件

     我们知道,Storm的强大之处就是能够非常easy地在集群中横向拓展它的计算能力,它会把整个运算过程切割成多个独立的tasks在集群中进行并行计算。在Storm中,一个task就是执行在集群中的一个Spout或Bolt实例。
     为了方便理解Storm怎样并行处理我们分给它的任务,这里我先介绍一下在集群中涉及到Topology的四种组件:
  • Nodes(machines):集群中的节点,就是这些节点一起工作来执行Topology。
  • Workers(JVMs):一个worker就是一个独立的JVM进程。每一个节点都能够通过配置执行一个或多个workers,一个Topology能够指定由多少个workers来执行。     
  • Executors(threads):一个worker JVM中执行的线程。一个worker进程能够执行一个或多个executor线程。一个Executor能够执行多个tasks,Storm默认一个每一个executor分配一个task。
  • Tasks(bolt/spout实例):Tasks就是spouts和bolts的实例,它详细是被executor线程处理的。
Storm集群中执行的各种组件及其并行

二、Storm中的并行(以WordCountTopology为例)

     我们能够通过配置来调整我们work的并行数量,如果我们不进行设置, Storm默认大部分过程的并行数量为1。如果我们对WordCountTopology不单独进行配置,那么我们的Topology运行情况例如以下图所看到的:
      我们的一个节点会为我们的Topology分配一个worker,这个worker会为每一个Task启动一个Executor线程。
Storm集群中执行的各种组件及其并行

2.1 为Topology添加workers

     一种最简单的提高Topology运算能力的途径就是为我们的Topology添加workers。Storm为我们提供了两种途径来添加workers:通过配置文件或通过程序设置。
     通过Config对象来配置workers:

           Config config = new Config();
     config.setNumWorkers(2);

注意:在LocalMode下无论设置几个workers,终于都仅仅有一个worker JVM进程。

2.2 配置executors和tasks

     前面我们已经说过,Storm会为每一个Topology组件创建一个task,而默认一个executor仅仅处理一个task。task是spouts和bolts的实例,一个executor线程可由处理多个tasks,tasks是真正处理详细数据的一个过程,我们在代码中写的spout和bolt能够看做是由集群中分布的tasks来执行的。Task的数量在整个topology执行期间通常是不变的,可是组件的Executors是有可能发生变化的。这也就意味着:threads<=tasks。

2.2.1 设置executor(thread)数量

     通过设置parallelism hint来指定一个组件的executors。
  • 描写叙述:每一个组件产生多少个Executor
  • 配置选项:?
  • 在代码中配置:
     以下我们指定SentenseSpout的并行数量为2,则这个Spout组件会有两个executors,每一个executor分配一个task,其Topology的执行情况例如以下图所看到的:
      builder.setSpout(SENTENCE_SPOUT_ID, spout,  2 );
Storm集群中执行的各种组件及其并行

2.2.2 设置task的数量

     通过setNumTasks()方法来指定一个组件的tasks数量。
     以下我们为 SplitSentenceBolt 设置4个tasks和2个executors,这种话每一个executor线程将被分配运行4/2=2个tasks,然后再为WordCountBolt分配4个task,每一个task由一个executor负责运行。其Topology例如以下图所看到的:

      builder.setBolt(SPLIT_BOLT_ID, splitBolt, 2).setNumTasks(4).shuffleGrouping(SENTENCE_SPOUT_ID);
     builder.setBolt(COUNT_BOLT_ID, countBolt, 4).fieldsGrouping(SPLIT_BOLT_ID, newFields("word"));

    假设一開始分配2个workers,则Topology的执行情况例如以下图所看到的:
 Storm集群中执行的各种组件及其并行

三、一个topology的样例

     以下这幅图展示了一个实际topology的全景,topology由三个组件组成,一个Spout:BlueSpout,两个Bolt:GreenBolt、YellowBolt。
Storm集群中执行的各种组件及其并行
     如上图,我们配置了两个worker进程,两个Spout线程,两个GreenBolt线程和六个YellowBolt线程,那么分布到集群中的话,每一个工作进程都会有5个executor线程。以下看一下详细代码:

      java Config conf = new Config();
     conf.setNumWorkers(2); // use two worker processes

     topologyBuilder.setSpout(“blue-spout”, new BlueSpout(), 2); // set parallelism hint to 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() );

     当然,Storm中也有一个參数来控制topology的并行数量:

四、怎样改变一个执行topology中的Parallelism

     Storm中一个非常好的特性就是能够在topology执行期间动态调制worker进程或Executor线程的数量而不须要重新启动topology。这样的机制被称作rebalancing。
     我们有两种方式来均衡一个topology:
  1. 通过Storm web UI来均衡
  2. 通过CLI tool storm 来均衡  
     以下就是一个CLI tool应用的样例:

 # Reconfigure the topology “mytopology” to use 5 worker processes, # the spout “blue-spout” to use 3 executors and # the bolt      “yellow-bolt” to use 10 executors.

      $ storm rebalance mytopology -n 5 -e blue-spout=3 -e yellow-bolt=10 















你可能感兴趣的:(storm)