zoukankan      html  css  js  c++  java
  • 理解Storm并发

    作者:Jack47

    PS:如果喜欢我写的文章,欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源

    注:本文主要内容翻译自understanding-the-parallelism-of-a-storm-topology

    本篇文章介绍了Storm拓扑的并发模型。介绍了Worker进程,Executor(线程)和Task(任务)之间的关系,如何按照需要配置他们。本文基于Storm 0.8.1版本,最新发布版本已经到了0.9.5了。
    对于不了解Storm的朋友,可以先去看看Storm介绍(一)

    拓扑的组成部分#

    在Storm集群上运行的拓扑主要包含以下的三个实体:

    • Worker进程
    • Executors
    • Tasks(任务)

    下图简单阐释了他们之间的关系:
    Storm_worker_processes_executors_tasks

    图1:Storm中worker进程,executor(线程)和任务的关系

    一个正在运行的拓扑由很多worker进程组成,这些worker进程在Storm集群的多台机器上运行。一个worker进程属于一个特定的拓扑并且执行这个拓扑的一个或多个component(spout或者bolt)的一个或多个executor。一个worker进程就是一个Java虚拟机(JVM),它执行一个拓扑的一个子集。

    一个executor是由一个worker进程产生的一个线程,它运行在worker的Java虚拟机里。一个executor为同一个component(spout或bolt)运行一个或多个任务。一个executor总会有一个线程来运行executor所有的task,这说明task在executor内部是串行执行的。

    真正的数据处理逻辑是在task里执行的,在父executor线程执行过程中会运行task。在代码中实现的每个spout或bolt是在全集群中以很多task的形式运行的。一个component的task数量在这个拓扑的生命周期中是固定不变的,但是一个component的executor(线程)数量会随着时间推移发生变化。这说明以下条件一直成立:threads数量 <= task数量。默认情况下task数量被设置成跟executor的数量是一样的,即Storm会在每个线程上执行一个任务(这通常是你想要的)。

    同时请注意:

    • executor线程的数量在拓扑已经启动后,可以发生变化(见下面的storm rebalance命令)。
    • 拓扑的task数量是固定的

    可以看“理解Storm内部的消息缓存”来从另外一个视角来看一个worker进程生命周期中运行的各种各样的线程和跟这些线程关联的executor和task。

    配置拓扑的并发度#

    注意Storm术语中“并发度(parallelism)“特定地用来描述所谓的"parallelism hint",它代表了一个component初始的executor(线程)数量。但在这篇文章中我使用更广泛意义的“并发度“来描述如何配置一个Storm拓扑中executor数量,worker进程数量以及task数量。当使用Storm中狭义的“并发度”时,我会特殊说明。

    下表是各种配置项的概述以及如何在代码中设置。有不止一种方法来设置这些选项,但是下表只列出了其中一些方法。Storm目前配置项的优先级是:外部component特定的配置>内部component特定的配置项>拓扑特定的配置项>storm.yaml>defaults.yaml。更多详情可以参阅Storm文档

    用途 描述 配置项 如何通过代码设置(例子)
    worker进程数量 拓扑在集群机器上运行时需要的worker进程数据量 Config#TOPOLOGY_WORKERS Config#setNumWorkers
    每个组件需要创建的executor数量 executor线程的数量 没有单独配置项 TopologyBuilder#setSpout()TopologyBuidler#setBolt() Storm 0.8之后使用 parallelism_hint参数来指定executor的初始数量
    task数量 每个组件需要创建的task数量 Config#TOPOLOGY_TASKS ComponentConfigurationDeclarer#setNumTasks()

    下面是一段如何实际设置这些配置的示例性代码:

    topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
    .setNumTasks(4)
    .shuffleGrouping("blue-spout");
    

    在上述代码中我们配置Storm以两个executor和4个task的初始数量去运行greenBolt。Storm会在每个executor(线程)上运行两个任务。如果你没有显示配置任务的数量,Storm会默认每个executor运行一个任务。

    在多租户的Storm集群上配置并发#

    在Storm 0.8.2中引入了隔离调度器,让多个拓扑很容易且安全地共享一个集群,例如,它解决了多租户的问题--避免多个拓扑之间的资源竞争--通过提供拓扑间的完全隔离

    当使用隔离调度器的时候Nathan[Storm作者]建议你把worker数量设置成机器数量的倍数。把executor数量设置成worker数量的倍数。如果你会调用setNumTasks()(多数人不会),应该设置成executor数量的倍数。这样做了之后,你的拓扑的负载就会均匀分布。每台机器和每个Java虚拟机进程会有相同数量的线程和大致等量的负载。Jason Jackson

    运行中的Storm拓扑的例子#

    下图阐释了在实际中一个简单拓扑看起来长什么样子。拓扑包含三个组件(component):一个叫BlueSpoutSpout,两个分别叫做GreenBoltYellowBoltBolt。组件相互连接而构成一个图结构:BlueSpout把输出发送给GreenBolt,同样GreenBolt把结果发送给YellowBolt

    Storm_example_of_a_running_topology

    运行中拓扑的例子

    还记得上面展示的配置GreenBolt代码吗?BlueSpoutYellowBolt只设置了parallelism_hint(executor数量)。下面是相关代码:

      Config conf = new Config();
      conf.setNumWorkers(2); // use two worker processes
    
      topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); // parallelism hint topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2).setNumTasks(4).shuffleGrouping("blue-spout");
      topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6).shuffleGrouping("green-bolt");
    
      StormSubmitter.submitToplogy("mytopology", conf, topologyBuilder.createTopology());
    

    改变正在运行拓扑的并发度#

    Storm一个灵巧的功能是可以增减worker进程或者executor的数量而不需要重启集群或者拓扑。这种做法叫做rebalancing

    有两种方法可以用来做拓扑的rebalance:

    1. 使用Storm web UI来做
    2. 使用下面介绍的命令行工具storm rebalance

    命令行的例子:

    # 重新配置“mytopology”拓扑使用5个worker进程[原来是2个]
    # "blue-spout"这个spout使用3个[原来有2个]executor
    # "yellow-bolt"使用10个[原来有6个]executor
    $ storm rebalance mytopology -n 5 -e blue-spout=3 -e yellow-bolt=10
    

    留给读者的问题###

    经过上面的rebalance命令,此时每个Bolt各自有几个executor,几个task,每个worker里面分配了几个executor?

    参考资料#

    Storm文档

    Storm介绍(一)

    Storm教程


    如果您看了本篇博客,觉得对您有所收获,请点击右下角的“推荐”,让更多人看到!
    资助Jack47写作,打赏一个鸡蛋灌饼钱吧
    pay_weixin
    微信打赏
    pay_alipay
    支付宝打赏
  • 相关阅读:
    485串口接线
    mvc3 升级mvc5
    VB连接ACCESS数据库,使用 LIKE 通配符问题
    VB6 读写西门子PLC
    可用的 .net core 支持 RSA 私钥加密工具类
    解决 Win7 远程桌面 已停止工作的问题
    解决 WinForm 重写 CreateParams 隐藏窗口以后的显示问题
    解决安装 .net framework 发生 extracting files error 问题
    CentOS7 安装配置笔记
    通过特殊处理 Resize 事件解决 WinForm 加载时闪烁问题的一个方法
  • 原文地址:https://www.cnblogs.com/Jack47/p/understanding_the_parallelism_of_a_storm_topology.html
Copyright © 2011-2022 走看看