如何设置Storm的并发

来源:互联网 发布:自考做题软件 编辑:程序博客网 时间:2024/05/17 08:41


1. storm并行的基本概念


  • storm集群中的一个supervisor节点可以运行一个或者多个worker,对应于一个或者多个topologies。1个worker进程运行1个或多个executor线程。每个worker从属于一个topology。executor是一个物理线程,每1个executor运行着相同的组件(spout或bolt)的1个或多个task。1个task执行着实际的数据处理。
    一个实际的例子:
  • 事项描述配置选项在代码中如何设置#worker processes为在集群上运行的topology创建多少worker进程Config#TOPOLOGY_WORKERSConfig#setNumWorkers#executors (threads)为每个组件(spout/bolt)生成多少个executor。?TopologyBuilder#setSpout()
    TopologyBuilder#setBolt()
    在Storm 0.8 中参数parallelism_hint
    为bolt具体话executor的数目而非task。
    #tasks为每个组件(spout/bolt)创建多少个executor。Config#TOPOLOGY_TASKSComponentConfigurationDeclarer#setNumTasks()


  • 如下例子为在实际上如何设置如上变量:
  • 配置一个Storm bolt的并行度
  • topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
                   .setNumTasks(4)
                   .shuffleGrouping("blue-spout");
  • 上代码为运行GreenBolt在Storm中配置2个executor和4个相应的task,Storm将在每个executor线程中运行2个task如果没有在代码进行配置,则默认以每个executor一个task来运行。
  • 2  是否需要提高workers数目
  • (1)  最好一台机器上的一个topology只使用一个worker,主要原因时减少了worker之间的数据传输


    workers的多少由supervisors来设置,与每个supervisor节点上的JVM槽数相关。在topology设置的事情就是多少个
    worker槽将被声明。推荐每个supervisor节点为每个topology创建一个worker。如果一个topology运行在8核的节点上,parallelism hint为24,则每个节点将为每个bolt启动8个executor,每个对应一个核。运行3个 worker(每个分配8executer)将比运行24个worker(每个分配1executer)更为有利。
  • 首先,在同一个worker中数据将在executor间分区,而不必命中transfer buffertuples将直接由发送方缓冲区到接收方缓冲区。如果目标executor在同一机器的不同worker,将经由send -> worker transfer -> local socket -> worker recv -> exec recv buffer
  • 再次,3个带有非常大的后台cache聚合器将好于24个有小的后台cache的聚合器。这将降低倾斜的影响,提高LRU效率。
  • 最后,越少的worker则意味着越少的控制流。

    (2) 增加worker的数目也会有性能的提升,这基于系统的瓶颈在哪里。每个worker有单个线程通过Zmq连接向另一worker传送tuple,如果瓶颈在CPU而且每个worker处理大量的tuple,更多的worker将获得更好的吞吐量。

  • 因此,没有明确的答案,应该基于各自的环境和设计尝试不同的配置。

    3 executor的数目

    executor是真正的并行度(事实上的并行度)。(task数目是想要设置的并行度)

    executor初始数目=spout数目+bolt数目+acker数目 (这些加起来也就是task数目。)

    spout数目,bolt数目,acker数目运行时是不会变化的,但是executor数目可以变化。 

    4   是否需要提高TASK数目

    TASK的存在只是为了topology扩展的灵活性,与并行度无关。



    配置拓扑的并发度

    注意Storm的术语"并发度(parallelism)"是特别用来描述所谓的parallelism hint的,这代表1个组件的初始的executor(线程)的数量。在此文档中我们使用术语"并发度"的一般意义来描述你不但可以配置executor的数量,还可以配置worker进程的数量,还可以是1个拓扑的task的数量。在用到并发度的狭义的定义时我们会特别提出。

    下面的小节给出了一些不同的配置选项,还有你如何在代码中设置它们。有多种方法可以进行设置,表格列举了其中几种。Storm目前有下列的配置优先级:defaults.yaml < storm.yaml < 特定拓扑的配置 < 内部特定组件的配置 < 外部特定组件的配置。

     

    worker进程的数量

    • 描述: 1个拓扑有多少个分布于集群中的机器的worker进程
    • 配置选项: TOPOLOGY_WORKERS
    • 如何在代码中设置 (例子):
      • Config#setNumWorkers

    executor的数量 (线程)

    • 描述: 每个组件会有多少个executor
    • 配置选项: ?
    • 如何在代码中设置 (例子):
      • TopologyBuilder#setSpout()
      • TopologyBuilder#setBolt()
      • 注意在Storm 0.8以后parallelism_hint参数指定的是bolt的初始的executor的数量。

    task的数量

    • 描述: 每个组件有多少task
    • 配置选项: TOPOLOGY_TASKS
    • 如何在代码中设置 (例子):
      • ComponentConfigurationDeclarer#setNumTasks()

    这是一个简单的代码例子,展示了在实践中如何设置:

    topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)

    .setNumTasks(4).shuffleGrouping("blue-spout);

    在上面的代码中我们配置了Storm运行GreenBolt指定了初始有2个executor和4个关连的task。Storm会在每个 executor(线程)2个task。如果你不想显式的配置task的数量,Storm会默认的为每个executor运行1个task。


    一个运行中的拓扑的例子

    下 面的图表展示了1个简单拓扑在实际操作中看起来是怎样的。这个拓扑包含了3个组件:1个spout叫做BlueSpout,2个bolt分别叫 GreenBolt和YellowBolt。BlueSpout发送它的输出到GreenBolt,GreenBolt又把它的输出发到 YellowBolt。
    了解Storm中的拓扑的并发度
     

    下面是对上图的简要分析:

    3个组件的并发度加起来是10,就是说拓扑一共有10个executor,一共有2个worker,每个worker产生10 / 2 = 5条线程。

    绿色的bolt配置成2个executor和4个task。为此每个executor为这个bolt运行2个task。

    下面的代码配置了这3个组件,相关代码如下:

    Config conf = new Config();

    conf.setNumWorkers(2); // 使用2个worker进程

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

    And of course Storm comes with additional configuration settings to control the parallelism of a topology, including:

    此外还有其他的配置来控制拓扑的并发度,包括了:

    • TOPOLOGY_MAX_TASK_PARALLELISM: 这个设置指定了1个单独的组件的executor的数量的上限。当在测试阶段使用本地模式运行1个拓扑时,用来限制生成的线程的数量。你可以像下面这样来使用:
    • Config#setMaxTaskParallelism().

    如何改变1个正在运行的拓扑的并发度

    Storm有一个不错的特性,你可以在不需要重启集群或拓扑,来增加或减少worker进程和executor的数量。这样行为成为rebalancing。

    你有两个选项可以rebalance1个拓扑:

    1. 使用Storm的web UI来rebalance。
    2. 像下面描述的那样,使用命令行工具来做:

    # 重新配置拓扑 “mytopology” 使用5个worker进程。

    # spout “blue-spout” 使用3个executor

    # bolt “yellow-bolt” 使用10个executor

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


    参考文献:

    (1)http://www.michael-noll.com/blog/2012/10/16/understanding-the-parallelism-of-a-storm-topology/

0 0
原创粉丝点击