zoukankan      html  css  js  c++  java
  • Storm中并发程度的理解

    Storm中涉及到了很多组件,例如nimbus,supervisor等等,在参考了这两篇文章之后,对这个有了更好的理解。

    Understanding the parallelism of a Storm topology

    https://github.com/nathanmarz/storm/wiki/Understanding-the-parallelism-of-a-Storm-topology

    http://www.cnblogs.com/yufengof/p/storm-worker-executor-task.html

    我们先理一下概念:

    1. 一般对于物理节点来讲,我们部署的节点的类型包括nimbus(master),supervisor(slave),通常是一个nimbus,多个supervisor。nimbus是负责安排任务给supervisor去完成的,即supervisor是实际上干活的。
    2. 而对于一个supervisor来讲,它可以包含多个worker,worker有可以包含多个executor,executor又可以执行多个task。

    这样一说就有点乱,因为这个worker、executor、task和topology,spout和bolt之间又是怎么样的对应关系呢??

    首先看下面一张图

                   

    supervisor和node是一一对应的关系,而worker就是process(进程),executor就是thread(线程),task就是在spout或bolt中定义的函数。

    这样就好理解了,这些从上到下都是一对多的关系。

    那supervisor,worker和executor跟topology或component(包括spout和bolt)之间的对应关系呢?

    1. 一个topology可以在多个supervisor上执行,一个supervisor也可以执行多个topology
    2. 但是,一个worker只执行某个topology,一个topology由多个worker来执行
    3. 一个executor可以执行一个component中的多个task,但是一个component可以由多个executor来执行,这就是我们在编程中指定的并发程度。后面会看到。
    4. 一个executor默认对应一个task
    5. 一个worker中包含多个executor,但是这些executor不一定都是用来处理同一个component

    我们看storm wiki中的一张图片来解释

                        

    对于这个topology,

    1. 它包含3个component,1个spout,2个bolt
    2. 它包含2个worker process,10个executor thread,12个task
    3. 同颜色属于同一个component
     1 Config conf = new Config();
     2 conf.setNumWorkers(2); // use two worker processes
     3 
     4 topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); // set parallelism hint to 2
     5 
     6 topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
     7                .setNumTasks(4)
     8                .shuffleGrouping("blue-spout");
     9 
    10 topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6)
    11                .shuffleGrouping("green-bolt");
    12 
    13 StormSubmitter.submitTopology(
    14         "mytopology",
    15         conf,
    16         topologyBuilder.createTopology()
    17     );

    代码如上,worker process,executor thread,task这些的数目都可以进行设置。

    所以接下来我们应该会关心一个topology默认对应的worker数是多少?一个executor默认对应的task数是多少?

    更重要的是,我们在编码过程中已经指定了worker process数和exector thread数,但是这两个数可以在运行时被修改,以更好地适应负载的变化!这样的方式叫做rebalance!

    它能够修改worker的数目,也就是说我们是否可以通过监控,来实现自动水平拓展呢??例如结合IaaS,加一个supervisor节点加入到集群中?同时启动对应的worker进程,当负载低的时候,收回对应的supervisor节点,将虚拟机返回到对应的VM池里呢??

    注意一点是:Task的数目在启动后就不能变了,但是可以改executor,即执行的线程数,所以executor数一定是小于等于task数,才能保证每一个executor至少有一个task可以运行.

    所以对于task数太少,后期也无法提高太多!

    1. 第一种方式是使用storm的UI
    2. 第二种方式是使用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

    具体请参考wiki的文章

  • 相关阅读:
    前端资料
    贪心
    二叉树的最大深度
    最长回文子串
    动态规划-tsp
    动态规划
    spfa与SLF和LLL(复习)
    动态规划之最长 公共子序列和上升子序列
    最近最远距离之暴力优化
    基于Element-UI封装的季度插件
  • 原文地址:https://www.cnblogs.com/longshaohang/p/3561492.html
Copyright © 2011-2022 走看看