storm源码阅读笔记之任务调度算法
3种Scheduler概述
EventScheduler:将系统中的可用资源均匀地分配给需要资源的topology,其实也不是绝对均匀,后续会详细说明DefaultScheduler:和EvenetScheduler差不多,只不过会先将其它topology不需要的资源重新收集起来,再进行EventSchedulerIsolationScheduler:用户可定义这个topology的机器资源,storm分配的时候会优先分配这些topology,以保证分配给该topology的机器只为这一个topology服务
DefaultScheduler
- 调用cluster的
needsSchedualerTopologies方法获得需要进行任务分配的topologies - 开始分别对每一个topology进行处理
- 调用cluster的
getAvailableSlots方法获得当前集群可用的资源,以<node,port>集合的形式返回,赋值给available-slots - 获得当前topology的executor信息并转化为
<start-t ask-id,end-task-id>集合存入all-executors,根据topology计算executors信息,采用compute-executors算法,稍后会讲解 - 然后调用EventScheduler的
get-alive-assigned-node+port->executors方法获得该topology已经获得的资源,返回<node+port,executor>集合的形式存入alive-assigned,为什么要计算当前topology的已分配资源情况而不是计算集群中所有已分配资源?,猜测可能是进行任务rebalance的时候会有用吧。 - 接着就调用
slot-can-reassign对alive-assigned中的slots信息进行判断,选出其中能被重新分配的slot存入变量can-reassigned - 这样可用的资源就由
available-slots和can-reassigned两部分组成 - 接下来计算当前topology能使用的全部slot数目
total-slots--to-use:min(topology的NumWorker数,available-slots+can-reassigned) - 如果
total-slots--to-use>当前已分配的slots数目,则调用bad-slots方法计算可被释放的slot - 调用cluster的
freeSlots方法释放计算出来的bad-slot - 最后调用EventScheduler的
schedule-topologies-evenly进行分配 - 继续下一个topology
- 调用cluster的
主要流程梳理:获得当前集群空闲资源->计算当前topology的executor信息(分配时会用得上)->计算可重新分配和可释放的资源->分配
EventScheduler
EventScheduler调度算法与Default相比少了一个计算可重新分配资源的环节,直接利用Supervisor中空闲的slot进行分配,在此不再细讲。
EventScheduler和DefaultScheduler调度举例:
这两种调度机制在一般情况下调度结果基本保持一致,所以一起来看:
集群初始状态

接下来我们提交3个topology
|
Topology |
Worker数 |
Executer数 |
Task数 |
|
T-1 |
3 |
8 |
16 |
|
T-2 |
5 |
10 |
10 |
|
T-3 |
3 |
5 |
10 |
1、提交T-1
- sort-slots算法对可用slots进行处理,结果为{[s1 6700] [s2 6700] [s3 6700] [s4 6700] [s1 6701] [s2 6701] [s3 6701] [s4 6701] [s1 6702] [s2 6702] [s3 6702] [s4 6702] [s1 6703] [s2 6703] [s3 6703] [s4 6703]}
- compute-executors算法计算后得到的Executor列表为:{[1 2] [3 4] [5 6] [7 8] [9 10] [11 12] [13 14] [15 16]};
注:格式为[start-task-id end-task-id],共8个worker,第一个包含2个task,start-task-id为1,end-task-id为2,所以记为[1 2],后面依次类推...compute-executors算法会在下一篇博客中详解 - 8个Executor在3个worker上的分布状态为[3,3,2]
- 分配结果为:
- {[1 2] [3 4] [5 6]} -> [s1 6700]
- {[7 8] [9 10] [11 12]} -> [s2 6700]
- {[13 14] [15 16]} -> [s3 6700]
分配后集群状态为:

2、提交T-2
- 可用的slot经过sort-slots后:{[s1 6701] [s2 6701] [s3 6701] [s4 6700] [s1 6702] [s2 6702] [s3 6702] [s4 6701] [s1 6703] [s2 6703] [s3 6703] [s4 6702] [s4 6703]}
- comput-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] [2 2]} -> [s1 6701]
- {[3 3] [4 4]} -> [s2 6701]
- {[5 5] [6 6]} -> [s3 6701]
- {[7 7] [8 8]} -> [s4 6700]
- {[9 9] [10 10]} -> [s1 6702]
分配后集群状态为:

3、提交T-3
- sort-slots后slot列表为:{[s1 6703] [s2 6702] [s3 6702] [s4 6701] [s2 6703] [s3 6703] [s4 6702] [s2 6704] [s3 6704] [s4 6703] [s4 6704]}
- compute-executors后得到的executor列表为:{[1 2] [3 4] [5 6] [7 8] [9 10]}
- 5个executor在3个worker上的分布为:[2,2,1]
- 分配结果为:
- {[1 2] [3 4]} -> [s1 6703]
- {[5 6] [7 8]} -> [s2 6702]
- [9 10] -> [s3 6702]
分配后集群状态为:

如图,此任务调度方式也不是绝对均匀的,s1已经满负荷运转,而s4才刚使用一个slots。
此篇用到的算法如comput-executors、sort-slots、slots-can-reassign、bad-slots、sort-slots等会在下篇博客中专门探讨
storm源码阅读笔记之任务调度算法的更多相关文章
- Apache Storm源码阅读笔记
欢迎转载,转载请注明出处. 楔子 自从建了Spark交流的QQ群之后,热情加入的同学不少,大家不仅对Spark很热衷对于Storm也是充满好奇.大家都提到一个问题就是有关storm内部实现机理的资料比 ...
- CI框架源码阅读笔记5 基准测试 BenchMark.php
上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功 ...
- CI框架源码阅读笔记4 引导文件CodeIgniter.php
到了这里,终于进入CI框架的核心了.既然是“引导”文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.c ...
- CI框架源码阅读笔记3 全局函数Common.php
从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap ...
- CI框架源码阅读笔记2 一切的入口 index.php
上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中, ...
- 源码阅读笔记 - 1 MSVC2015中的std::sort
大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格 ...
- Three.js源码阅读笔记-5
Core::Ray 该类用来表示空间中的“射线”,主要用来进行碰撞检测. THREE.Ray = function ( origin, direction ) { this.origin = ( or ...
- PHP源码阅读笔记一(explode和implode函数分析)
PHP源码阅读笔记一一.explode和implode函数array explode ( string separator, string string [, int limit] )此函数返回由字符 ...
- AQS源码阅读笔记(一)
AQS源码阅读笔记 先看下这个类张非常重要的一个静态内部类Node.如下: static final class Node { //表示当前节点以共享模式等待锁 static final Node S ...
随机推荐
- 【轮廓线DP】POJ2411-Mondriaan's Dream
今天美国的院士过来讲课XD以为会很无聊但是谜之好听,而且英语基本上都听懂了的样子♪(´▽`) 逃到图书馆来写解题报告 [题目大意] 给出一个m*n的方格,用2*1的骨牌覆盖有几种情况. [思路] 最基 ...
- [ZHOJ1131]Find K Min
题目大意: 给你一个数列,求其中第K大的数. 思路: 类似于快速排序的思想,每次可以确定出当前的的x在数组中的位置. 然后根据位置选择该往左找还是往右找. #pragma GCC optimize(3 ...
- JavaScript设计模式与开发实践——读书笔记1.高阶函数(下)
上部分主要介绍高阶函数的常见形式,本部分将着重介绍高阶函数的高级应用. 1.currying currying指的是函数柯里化,又称部分求值.一个currying的函数会先接受一些参数,但不立即求值, ...
- php -- php读取sqlserver中的datetime出现的格式问题
php连接sqlserver2005时,读取出来的数据是01 15 2014 12:00AM, 也就是说日期的格式是MM DD YY hh:mmAM 那如何把它转变成24小时制,且显示的格式为YY-M ...
- luoguoj 1598 垂直柱状图 模拟
P1598 垂直柱状图 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.luogu.org/problem/show?pid=1598 ...
- windows server 2008 r2, 每隔一段时间自动关机
前段时间在做Exchange 2010测试的时候,由于windows server 2008 r2试用过期,开机后二个小时就会自动关机,可是我又不想重装系统,加为那样我可能需要重装好多东西,包括 ...
- UML建模之时序图(Sequence Diagram)教程
一.时序图 时序图是一种强调时间顺序的交互图,在时序图中,首先把参与交互的对象放在图的上方,沿X轴方向排列.通常把发起交互的对象放在左边,较下级对象依次放在 右边,然后把这些对象发送和接受的消息沿Y轴 ...
- 《UNIX环境高级编程》笔记--errno是否是线程安全的?
当UNIX函数出错时,常常返回一个负数,而且整形变量errno通常被设置为含有附加信息的一个值,例如,open函数如成功,返回 一个非负文件描述符,如果出错就返回-1,在open出错时,有大约15种不 ...
- OPENGL架构
第2章 OpenGL 简介 每台计算机都有专门处理图形的硬件,它们控制着屏幕上显示的内容.OpenGL向这种硬件发出命令,告诉它们执行什么操作.计算机游戏或者其他任意软件借助制造商提供的设备驱动程序, ...
- struts2 action通配符
首先,看一个struts2的配置文件: <package name="actions" extends="struts-default" namespac ...