理解Storm并发

时间:2021-07-27 15:31:03

作者: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并发

图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并发

运行中拓扑的例子

还记得上面展示的配置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写作,打赏一个鸡蛋灌饼钱吧
理解Storm并发
微信打赏
理解Storm并发
支付宝打赏

理解Storm并发的更多相关文章

  1. storm源码之理解Storm中Worker、Executor、Task关系 &plus; 并发度详解

    本文导读: 1 Worker.Executor.task详解 2 配置拓扑的并发度 3 拓扑示例 4 动态配置拓扑并发度 Worker.Executor.Task详解: Storm在集群上运行一个To ...

  2. 用实例的方式去理解storm的并发度

    什么是storm的并发度 一个topology(拓扑)在storm集群上最总是以executor和task的形式运行在suppervisor管理的worker节点上.而worker进程都是运行在jvm ...

  3. 【原】理解Storm拓扑的并行

    Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...

  4. Storm并发度和Grouping方式

    Storm并发度和Grouping方式 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans ...

  5. 用 Python 理解 Web 并发模型

    用 Python 理解 Web 并发模型 http://www.jianshu.com/users/1b1fde012122/latest_articles   来源:MountainKing 链接: ...

  6. 深入理解Java并发框架AQS系列(一):线程

    深入理解Java并发框架AQS系列(一):线程 深入理解Java并发框架AQS系列(二):AQS框架简介及锁概念 一.概述 1.1.前言 重剑无锋,大巧不工 读j.u.c包下的源码,永远无法绕开的经典 ...

  7. 深入理解Java并发框架AQS系列(二):AQS框架简介及锁概念

    深入理解Java并发框架AQS系列(一):线程 深入理解Java并发框架AQS系列(二):AQS框架简介及锁概念 一.AQS框架简介 AQS诞生于Jdk1.5,在当时低效且功能单一的synchroni ...

  8. 深入理解Java并发框架AQS系列(四):共享锁(Shared Lock)

    深入理解Java并发框架AQS系列(一):线程 深入理解Java并发框架AQS系列(二):AQS框架简介及锁概念 深入理解Java并发框架AQS系列(三):独占锁(Exclusive Lock) 深入 ...

  9. &lbrack;Storm&rsqb; 并发度的理解

    Tasks & executors relation Q1. However I'm a bit confused by the concept of "task". Is ...

随机推荐

  1. &lbrack;原&rsqb;RobotFrameWork(四)变量运算与Evaluate

    一.特殊变量运算: 执行结果: 二.Evaluate使用 函数释义:Evaluate是执行python表达式,并返回执行结果 示例1: 执行结果: 示例2: 执行结果: 作者:liuheng12345 ...

  2. Linux 2&period;6 完全公平调度算法CFS(Completely Fair Scheduler) 分析

    转会http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/index.html? ca=drs-cn-0125 ...

  3. python3中用HTMLTestRunner&period;py报ImportError&colon; No module named &&num;39&semi;StringIO&&num;39&semi;解决办法

    .原因是官网的是python2语法写的,看官手动把官网的HTMLTestRunner.py改成python3的语法: 参考:http://bbs.chinaunix.net/thread-415474 ...

  4. Go 变量声明后若不赋值,各类型默认值

    Go 变量声明后若不赋值,各类型默认值(数字类型默认为 0,其他类型为 nil): 数据类型 默认值 bool false string 空字符串 int 0 float32 0 float64 0 ...

  5. DateFormat抽象类实现日期与字符串的转换

    [需求]日期是可以计算的,而日期字符串无法计算. 由于DateFormat是抽象类,我们一般都是用的它的子类SimpleDateFormat. [SimpleDateFormat构造方法] 1)Sim ...

  6. css杂烩

    持续更新... 在css中处理外边距合并时,思路是触发BFC,因为在创建了块级格式化的元素中(垂直排列),不会和它的子元素发生外边距合并.而BFC可以通过float(不包括none),overflow ...

  7. Database学习 - mysql 数据库 数据操作

    mysql数据操作 查询语法 select * | field1,field1 ... from 表名 where 条件 group by 字段 having 筛选 order by 字段 limit ...

  8. HTML响应状态码

    https://www.restapitutorial.com/httpstatuscodes.html

  9. 03-04&lowbar;配置并启动Managed Server&lpar;受管服务器&rpar;

    本文重点: 配置Managed Servers(受管服务器) 启动Managed Servers 原理 运行多个Managed Servers实例             一.配置Managed Se ...

  10. 数据平面可编程与SDN关系理解,以及数据平面可编程的理解

    数据平面可编程与SDN关系 狭义 广义 数据平面可编程的理解 狭义 广义