• 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中的并行(以WordCountTopology为例)

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

    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);

    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的执行情况例如以下图所看到的:
     

    三、一个topology的样例

         以下这幅图展示了一个实际topology的全景,topology由三个组件组成,一个Spout:BlueSpout,两个Bolt:GreenBolt、YellowBolt。

         如上图,我们配置了两个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 















  • 相关阅读:
    前端css实现最基本的时间轴
    前端css实现最基本的时间轴
    那些年遇见的奇葩编程书籍封面
    那些年遇见的奇葩编程书籍封面
    2018年国内就业薪资高的7大编程语言排行
    乡愁
    乡愁
    微光系列之青春无敌美少女
    1287 矩阵乘法
    一些关于DP的知识
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4297871.html
Copyright © 2020-2023  润新知