Scheduler是storm的调度器,负责为topology分配当前集群中可用的资源。Storm分别提供了3中调度器:

  1. EvenScheduler:会将系统中的可用资源均匀地分配给当前需要任务分配的多个topology。
  2. DefaultScheduler:跟EvenScheduler基本上一样,唯一区别在于它在为topology分配任务之前先释放掉其他Topology不再需要的资源,然后调用EvenScheduler方法为topology均匀分配资源。
  3. IsolationScheduler:它有比较特殊的机制,使得用户可以单独为某些topology指定它们需要的机器资源(机器数)。用户需要在storm配置项中指定这些信息,IsolationScheduler会优先对这些Topology分配任务,保证分配给某个topology的机器只能运行这个特定的topology,也就是说这些topology的运行环境是相互独立的。

这三个调度器是用clojure写的,先忽略掉,等待后面分析源码部分再写。

先来举一个实际例子,看一下storm的调度过程,相信大家一看都能明白。

【场景】假设当前集群中有6台机器,每台机器上可用端口均为6700、6701、6702、6703,并且当前急群中没有正在运行的topology,初始状态如如所示:

下表是我们依次要提交的3个topology:

Topology Worker数目 Executor数目 Task数目
T-1 3 8 16
T-2 5 10 10
T-3 8 16 16

正常情况下,EvenScheduler和DefaultScheduler的调度结果是一致的,这两个可以放在一起。看看会经过如下阶段:

1、提交T-1

  • 可用的slot列表经过sort-slots方法处理后的结果是:{[S1,6700][S2,6700][S3,6700][S4,6700][S5,6700][S6,6700][S1,6701][S2,6701][S3,6701][S4,6701][S5,6701][S6,6701][S1,6702][S2,6702][S3,6702][S4,6702][S5,6702][S6,6702][S1,6703][S2,6703][S3,6703][S4,6703][S5,6703][S6,6703]}
  • compute-executors方法计算完后得到的Executor列表为:{[1,2][3,4][5,6][7,8][9,10][11,12][13,14][15,16]}(假设TaskList为自然序数)
  • 8个Executor在3个Worker上分布的情况是[3,3,2]
  • 分配结果如下:
  1. {[1,2][3,4][5,6]} ->[S1,6700]
  2. {[7,8][9,10][11,12]} ->[S2,6700]
  3. {[13,14][15,16]} ->[S3,6700]

此时,集群中的任务分配情况为:

2、提交T-2

  • 可用的slot列表经过sort-slots方法处理后的结果是:{[S1,6701][S2,6701][S3,6701][S4,6700][S5,6700][S6,6700][S4,6701][S5,6701][S6,6701][S1,6702][S2,6702][S3,6702][S4,6702][S5,6702][S6,6702][S1,6703][S2,6703][S3,6703][S4,6703][S5,6703][S6,6703]}
  • compute-executors方法计算完后得到的Executor列表为:{[1,1][2,2][3,3][4,4][5,5][6,6][7,7][8,8][9,9][10,10]}
  • 10个Executor在5个Worker上的分布情况是[2,2,2,2,2]
  • 分配结果如下:
  1. {[1,1][2,2]} ->[S1,6701]
  2. {[3,3][4,4]} ->[S2,6701]
  3. {[5,5][6,6]} ->[S3,6701]
  4. {[7,7][8,8]} ->[S4,6700]
  5. {[9,9][10,10]} ->[S5,6700]

此时集群中的任务分配情况如下:

3、提交T-3

  • 可用的slot列表经过sort-slots方法处理后的结果是:{[S1,6702][S2,6702][S3,6702][S4,6701][S5,6701][S6,6700][S1,6703][S2,6703][S3,6703][S4,6702][S5,6702][S6,6701][S4,6703][S5,6703][S6,6702][S6,6703]}
  • compute-executors方法计算完后得到的Executor列表为:{[1,1][2,2][3,3][4,4][5,5][6,6][7,7][8,8][9,9][10,10][11,11][12,12][13,13][14,14][15,15][16,16]}

storm中的Scheduler的更多相关文章

  1. Storm中遇到的日志多次重写问题(一)

    业务描述: 统计从kafka spout中读取的数据条数,以及写入redis的数据的条数,写入hdfs的数据条数,写入kafaka的数据条数.并且每过5秒将数据按照json文件的形式写入日志.其中保存 ...

  2. Storm中Spout使用注意事项小结

    Storm中Spout用于读取并向计算拓扑中发送数据源,最近在调试一个topology时遇到了系统qps低,处理速度达不到要求的问题,经过排查后发现是由于对Spout的使用模式不当导致的多线程同步等待 ...

  3. storm源码之理解Storm中Worker、Executor、Task关系 + 并发度详解

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

  4. Storm中并发程度的理解

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

  5. Spark中的Scheduler

    Spark中的Scheduler scheduler分成两个类型.一个是TaskScheduler与事实上现,一个是DAGScheduler. TaskScheduler:主要负责各stage中传入的 ...

  6. 【Storm篇】--Storm中的同步服务DRPC

    一.前述 Drpc(分布式远程过程调用)是一种同步服务实现的机制,在Storm中客户端提交数据请求之后,立刻取得计算结果并返回给客户端.同时充分利用Storm的计算能力实现高密度的并行实时计算. 二. ...

  7. storm中的一些概念

    1.topology 一个topolgy是spouts和bolts组成的图,通过stream groupings将图中的spout和bolts连接起来:如图所示: 一个topology会一直运行知道你 ...

  8. storm中worker、executor、task之间的关系

    这里做一些补充: worker是一个进程,由supervisor启动,并只负责处理一个topology,所以不会同时处理多个topology. executor是一个线程,由worker启动,是运行t ...

  9. storm中的基本概念

    Storm是一个流计算框架,处理的数据是实时消息队列中的,所以需要我们写好一个topology逻辑放在那,接收进来的数据来处理,所以是通过移动数据平均分配到机器资源来获得高效率. Storm的优点是全 ...

随机推荐

  1. Android简易实战教程--第四话《最简单的短信发送器》

    首先配置一个布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmln ...

  2. 后端分布式系列:分布式存储-HDFS 异常处理与恢复

    在前面的文章 <HDFS DataNode 设计实现解析>中我们对文件操作进行了描述,但并未展开讲述其中涉及的异常错误处理与恢复机制.本文将深入探讨 HDFS 文件操作涉及的错误处理与恢复 ...

  3. C++ 对象的内存布局(上)

    本文转载自haoel博主的博客:陈皓专栏 [空谷幽兰,心如皓月] 原文地址:C++ 对象的内存布局(上) C++ 对象的内存布局(上) 陈皓 http://blog.csdn.net/haoel 点击 ...

  4. (九十四)集成PKRevealController实现左右抽屉视图

    使用PKRevealController可以实现类似于QQ等软件的左右抽屉视图,拖出的视图分为leftView和rightView,分别取自View的左半部分和右半部分,因此,根据不同的需求,可以选择 ...

  5. 初识WCF之使用配置文件部署WCF应用程序

    二月份的开头,小编依旧继续着项目开发之路,开始接触全新的知识,EF,WCF,MVC等,今天小编来简单的总结一下有关于WCF的基础知识,学习之前,小编自己给自己提了两个问题,WCF是什么?WCF能用来做 ...

  6. Eclipse 快捷方式 指定 固定 workspace

    右点击Eclipse快捷键,然后点击属性, 把目标(target)内容修改如下: clipse -data c:\myworkspace -vm c:\ j2sdk1.5\jre\bin\javaw ...

  7. Android进阶(二十八)上下文菜单ContextMenu使用案例

    上下文菜单ContextMenu使用案例 前言 回顾之前的应用程序,发现之前创建的选项菜单无法显示了.按照正常逻辑来说,左图中在"商品信息"一栏中应该存在选项菜单,用户可进行分享等 ...

  8. UNIX环境高级编程——管道和FIFO的额外属性

    一个描述符能以两种方式设置成非阻塞. (1)调用open时可以指定O_NONBLOCK标志. writefd = open(FIFO1,O_WRONLY | O_NONBLOCK,0); (2)如果一 ...

  9. Spark程序开发-环境搭建-程序编写-Debug调试-项目提交

    1,使用IDEA软件进行开发. 在idea中新建scala project, File-->New-->Project.选择Scala-->Scala 2,在编辑窗口中完成Word ...

  10. 阿里电话面试问题----100万个URL如何找到出现频率最高的前100个?

    内推阿里电话面试中面试官给我出的一个题: 我想的头一个解决方案,就是放到stl 的map里面对出现的频率作为pair的第二个字段进行排序,之后按照排序结果返回: 下面口说无凭,show your co ...