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

简介: 一、Storm中运行的组件      我们知道,Storm的强大之处就是可以很容易地在集群中横向拓展它的计算能力,它会把整个运算过程分割成多个独立的tasks在集群中进行并行计算。在Storm中,一个task就是运行在集群中的一个Spout或Bolt实例。      为了方便理解Storm如何并行处理我们分给它的任务,这里我先介绍一下在集群中涉及到Topology的四种组件:

一、Storm中运行的组件

     我们知道,Storm的强大之处就是可以很容易地在集群中横向拓展它的计算能力,它会把整个运算过程分割成多个独立的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 















目录
相关文章
mitt.js:小型事件发布订阅库
mitt.js:小型事件发布订阅库
1862 0
|
11月前
|
人工智能 安全 API
最近谈论 SSE 和 WebSocket 的人越来越多的原因
实时通信已经成了大模型应用的标配。
1440 238
最近谈论 SSE 和 WebSocket 的人越来越多的原因
|
存储 消息中间件 运维
从单体到微服务:架构演进中的技术挑战与解决方案
在软件开发的过程中,系统架构的选择对项目的成功与否起到至关重要的作用。本文将深入探讨从单体架构向微服务架构演进过程中所遇到的技术挑战,并提供相应的解决方案。
516 27
|
机器学习/深度学习 人工智能 TensorFlow
使用Python和TensorFlow实现图像识别
【8月更文挑战第31天】本文将引导你了解如何使用Python和TensorFlow库来实现图像识别。我们将从基本的Python编程开始,逐步深入到TensorFlow的高级功能,最后通过一个简单的代码示例来展示如何训练一个模型来识别图像。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息。
447 53
|
人工智能 自然语言处理 算法
AI时代的企业内训全景图:从案例到实战
作为一名扎根在HR培训领域多年的“老兵”,我越来越清晰地感受到,企业内训的本质其实是为企业持续“造血”。无论是基础岗的新人培训、技能岗的操作规范培训,还是面向技术中坚力量的高阶技术研讨,抑或是管理层的战略思维提升课,内训的价值都是在帮助企业内部提升能力水平,进而提高组织生产力,减少对外部资源的依赖。更为重要的是,在当前AI、大模型、Embodied Intelligence等新兴技术快速迭代的背景下,企业必须不断为人才升级赋能,才能在市场竞争中保持领先。
1576 13
|
监控 安全 Java
Java多线程调试技巧:如何定位和解决线程安全问题
Java多线程调试技巧:如何定位和解决线程安全问题
303 2
【逆向】使用x64dbg实现qq私聊与群消息防撤回
使用x32dbg调试32位QQ,通过附加QQ进程并禁用断点。搜索im.dll,找到消息撤回函数,设断点。发测试消息并观察中断点,定位到0X0F01D112C。用NOP替换疑似撤回函数的CALL指令,测试成功后保存为补丁,替换原IM.dll文件,完成防撤回。群聊防撤回类似,需单独找对应函数。注意仅防本地撤回,服务器上仍会显示撤回。
【逆向】使用x64dbg实现qq私聊与群消息防撤回
|
机器学习/深度学习 算法 大数据
Vision Transformer 必读系列之图像分类综述(三): MLP、ConvMixer 和架构分析(下)
在 Vision Transformer 大行其道碾压万物的同时,也有人在尝试非注意力的 Transformer 架构(如果没有注意力模块,那还能称为 Transformer 吗)。这是一个好的现象,总有人要去开拓新方向。相比 Attention-based 结构,MLP-based 顾名思义就是不需要注意力了,将 Transformer 内部的注意力计算模块简单替换为 MLP 全连接结构,也可以达到同样性能。典型代表是 MLP-Mixer 和后续的 ResMLP。
1465 0
Vision Transformer 必读系列之图像分类综述(三): MLP、ConvMixer 和架构分析(下)
|
传感器 数据采集 存储
STM32--GPIO
STM32--GPIO
274 0