Storm系列(六)架构分析之Scheduler-调度器[EventScheduler]
任务调度接口定义:
| 1 | IScheduler{ |
| 2 | // conf为当前nimbus的stormp配置 |
| 3 | void prepare(Map conf); // 初始化 |
| 4 | // topologyies表示集群中所有topology信息,cluster表示当前集群包括用户自定义调度逻辑事所需的所有资源(Supervisor、Solt、以及任务分配情况) |
| 5 | void schedule(Topologies topologies,Cluster cluster); |
| 6 | }; |
EventScheduler
实现流程图:

功能:对资源进行均匀分配的调度器,实现了IScheduler接口, schedule方法实现如下
| 1 | defn– schedule[this ^Topologies topologyies ^Cluster cluster] |
| 2 | (schedule-topologies-evenly topologies cluster) |
schedule-topologies-evenly方法原型:
| 1 | defn schedule-topologies-evenly[^Topologies topologies ^Cluster cluster] |
方法说明:
- 调用cluster对象的needsSchedulingTopology方法获取需要进行任务调度的Topology集合,判读依据:Topology设置的NumWorkers数目是否大于已经分配给该Topology的Worker数目,以及该Topology尚未分配的Executor数目是否大于0.
- 对需要进行任务调度的Topology获取其topology-id,然后调用schedule-topology方法获取到new-assignment(<executor,node+port>集合)。
- 用node和port信息构造WorkerSlot对象并将作为slot.
- 对Executor集合中的每一项构造ExecutorDetail对象,并返回一个ExecutorDetails集合。
- 调用cluster的assign方法将计算出来的slot分配给与该Topology相对应的executors.
schedule-topology
方法原型:
| 1 | defn- schedule-topology [^TopologyDetails topology ~Cluster cluster] |
方法说明:
- 调用cluster的getAvailableSlots方法获取当前集群可用的slot资源(集群中还没使用的Supervisor端口),并转换为<node,port>集合(available-slots).
- 将topology中的ExecutorDetails集合转换为<start-task-id,end-task-id>集合。
- 调用get-alive-assigned-node+port->executors方法获取当前topology已经分配的资源情况,返回<node+port,executors>集合(alive-assigned)。
- 获取当前topology可以使用的slot数目,topology设置的worker数目与当前available-slots数目加上alive-assigned数据二者的最小值(total-slots-to-use)。
- 对available-slots进行排序,计算需要分配的solt数目(total-slots-to-use减去alive-assigned),从排序后的solt中顺序获取需要分配的solt做为reassign-solts.
- 比较all-executors跟已分配的Executor集合间的差异,获取需要进行分配的Executor集合,做为reassign-executors.
- 将计算出来的reassign-solts与reassign-executor进行关联,转换为<executor,slot>映射集合(映射方式为:使executor均匀的分布在slot上),保存到ressignment中.
Storm系列(六)架构分析之Scheduler-调度器[EventScheduler]的更多相关文章
- Storm系列(七)架构分析之Scheduler-调度器[DefaultScheduler]
Storm默认的任务调度器.实现如下: 1 (defn –prepare [this conf]) 2 (defn –schedule [this ^Topologies topologies ^ ...
- scrapy 源码解析 (四):启动流程源码分析(四) Scheduler调度器
Scheduler调度器 对ExecutionEngine执行引擎篇出现的Scheduler进行展开.Scheduler用于控制Request对象的存储和获取,并提供了过滤重复Request的功能. ...
- Storm系列(五)架构分析之Nimbus启动过程
启动流程图 mk-assignments 功能:对当前集群中所有Topology进行新一轮的任务调度. 实现源码路径: \apache-storm-0.9.4\storm-core\src\clj ...
- Nimbus<一>Storm系列(五)架构分析之Nimbus启动过程
启动流程图 mk-assignments 功能:对当前集群中所有Topology进行新一轮的任务调度. 实现源码路径: \apache-storm-0.9.4\storm-core\src\clj\b ...
- Storm系列(九)架构分析之Supervisor-同步Nimbus的事件线程
Supervisor由三个线程组成,一个计时器线程和两个事件线程. 计时器线程负责维持心跳已经更新Zookeeper中的状态,还负责每隔一定的时间将事件线程需要执行的事件添加到其对应的队列中. 两个事 ...
- Storm系列(十三)架构分析之Worker-维护ZMQ连接
Worker根据Topology的定义及分配到自身的任务情况,计算出发出的消息被那些Task接收,由于Worker上分配的任务可能被调整,因此Worker需要定时的更新这些连接信息. ZMQ连接信息更 ...
- Storm系列(十一)架构分析之Supervisor-管理Worker进程的事件线程
处理流程: 方法原型: (defn sync-processes [supervisor]) 函数说明: Supervisor是一个supervisor-data对象. 从local-state中 ...
- 【原创】(六)Linux进程调度-实时调度器
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- quartz2.3.0(十二)通过RMI协议向Scheduler调度器远程添加job任务
此代码示例通过RMI协议向Scheduler调度器远程添加job任务. 代码文件包括:job任务类(SimpleJob.java).RMI服务端server类(RemoteServerExample. ...
随机推荐
- Python 基础篇:字符串、列表操作
字符串操作 判断是否为数字 string = "200" string.isdigit() >>false 待完善.. 列表操作 列表是我们最以后最常用的数据类型之一, ...
- controller.pp 各组件的安装顺序
controller 属性: admin_address => $controller_node_address, public_address => $c ...
- Project not selected to build for this solution configuration.
Project not selected to build for this solution configuration. When you upgrade your older solutio ...
- C#并行和多线程编程_(1)认识Parallel
Parallel: 英 [ˈpærəlel] 美 [ˈpærəˌlɛl] ,并联的,并行的. 随着多核时代的到来,并行开发越来越展示出它的强大威力!使用并行程序,充分的利用系统资源,提高程序的性 ...
- Android XML文件解析
在Android平台上可以使用Simple API for XML(SAX) . Document Object Model(DOM)和Android附带的pull解析器解析XML文件. 下面是本例子 ...
- mongodb MongoDB 聚合 group
MongoDB 聚合 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.col ...
- Java编程思想(2)之一切皆对象
- Javascript与C#相互调用
javascript调用C#代码 前台js调用后台代码方法,此方法只适用于后台方法的修饰符为public或protected,如果是其他修饰符会报错. >后台C#代码: protected in ...
- Hansight
http://www.hansight.com/scenarios.html#account
- activiti集成spring异常(DbSqlSession)
在eclipse配置一个简单的activiti项目,配置的是mysql数据库,报错如下: SLF4J: Failed to load class "org.slf4j.impl.Static ...