Storm系列(七)Scheduler-调度器[DefaultScheduler]

Storm默认的任务调度器。实现如下:

(defn –prepare [this conf])
(defn –schedule [this ^Topologies topologies ^Cluster cluster]
(default-schedule topologies cluster))

default-schedule

方法原型:

(defn default-schedule [^Topologies topologies ^Cluster cluster])

方法说明:

  1. 调用cluster对象的needsSchedulingTopology方法获取需要进行任务调度的Topology集合.
  2. 调用cluster的getAvailableSlots方法获取当前集群可用的slot资源(集群中还没使用的Supervisor端口),并转换为<node,port>集合(available-slots).
  3. 将topology中的ExecutorDetails集合转换为<start-task-id,end-task-id>集合存入all-executors.
  4. 调用get-alive-assigned-node+port->executors方法获取当前topology已经分配的资源情况,返回<node+port,executors>集合(alive-assigned).
  5. 调用slots-can-ressign方法对alive-assigned的slot信息进行判断,选择其中可被重新分配的slot集合并保存到can-ressign-slots变量中。
  6. 计算当前Topology所能使用的全部slot的数目,topology设置的worker数目与当前available-slots数目加上can-ressign-slots数据二者的最小值(total-slots-to-use)。
  7. 判断total-slots-to-use的数目是否大于当前已分配的slot数目(alive-assigned),若大于则调用bad-slots方法计算所有可能被释放的slot.
  8. 调用cluster的freeSlots方法释放前面计算出来的bad-slots。
  9. 调用EventScheduler的schedule-topologies-evenly方法将系统中的资源均匀分配该Topology.

 

调度流程图:

slots-can-reassign

功能:从已经分配给当前Topology的资源中过滤出可以继续使用的资源。

函数原型:

(defn slots-can-reassign [^Cluster cluster slots])

方法说明:

  1. 参数slots为已分配的slots资源,<node,port>集合。
  2. 对传入的slots进行过滤,过滤方式:选判断slots的node信息是否存在于集群的黑名单中,如果不在,继续判断slot的port是否在与node相对应的Supervisor的所有可用端口列表中,如果在该slots就可以继续使用。

bad-slots

功能:计算一个Topology已经分配的资源中哪些是不再需要的。

函数原型:

(defn- bad-slots [existing-slots num-executors num-workers])

参数说明:

Existing-slots:已分配给Topology的资源,<[node,port],executors>集合。

Num-executors:Topology的所有Executor(包括已分配和未分配的)。

Num-workers:Topology可使用的全部slot数目。

方法说明:

  1. 判断num-workers是否为0,如果是表示当前没有可供该Topology使用的slots并返回空集合。
  2. 定义distribution、keepers集合,调用integer-divided方法将num-executors均匀地分配到num-worksers中结果集保存到distribution集合中,结果集格式<executor-count,worker-count>, executor-count表示单个worker被分配Executor的个数,worker-count表示有多少个这样的worker,keepers集合默认为空.
  3. 对existing-slots中的每一项计算executor-count,然后根据distribution集合,及该executor-count为键获取值,若所获取值大于0,意味着存在这样的分配,这时将该<[node,port],executors>信息放入keepers中,同时将distribution中该executor-count的对应值减一。
  4. 从existing-slots中移除keepers中记录的需要继续维持的分配情况,若移除完之后还存在slot信息,则表明这些slot可以被释放,并将其转换为workerslot对象集合返回。
时间: 2024-10-09 23:49:00

Storm系列(七)Scheduler-调度器[DefaultScheduler]的相关文章

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  }:  

JStorm与Storm源码分析(三)--Scheduler,调度器

Scheduler作为Storm的调度器,负责为Topology分配可用资源. Storm提供了IScheduler接口,用户可以通过实现该接口来自定义Scheduler. 其定义如下: public interface IScheduler { //接收当前Nimbus的Storm配置作为参数,进行一些初始化工作 void prepare(Map conf); /** * 真正进行任务分配的方法,在Nimbus进行任务分配的时候会调用该方法. * 参数为topologies.cluster:前

Yarn 调度器Scheduler详解

理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源.在Yarn中,负责给应用分配资源的就是Scheduler.其实调度本身就是一个难题,很难找到一个完美的策略可以解决所有的应用场景.为此,Yarn提供了多种调度器和可配置的策略供我们选择. 一.调度器的选择 在Yarn中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,FairS ched

Yarn 组件的指挥部 – 调度器Scheduler

linux基础 为hadoop集群的搭建扫清了障碍,也为内存的管理,文件系统的管理扫清了障碍 接着到Hadoop的阶段,首先做集群的安装,深入到使用这两个核心的组件,分布式文件系统HDFS,解决大量数据怎么存储的问题,第二个就是分布式计算MapReduce.MapReduce的包含Yarn和MapReduce,随着集群规模的扩大,资源的管理必要用一个单独的组件Yarn来管理,程序员只要关注如何来写程序就好了. 然后讲了Zookeeper: 轻量级组件,往大数据集群里导数据的,比如Sqoop和Fl

JStorm与Storm源码分析(四)--均衡调度器,EvenScheduler

EvenScheduler同DefaultScheduler一样,同样实现了IScheduler接口, 由下面代码可以看出: (ns backtype.storm.scheduler.EvenScheduler (:use [backtype.storm util log config]) (:require [clojure.set :as set]) (:import [backtype.storm.scheduler IScheduler Topologies Cluster Topolo

Chromium网页渲染调度器(Scheduler)实现分析

在采用线程化渲染方式渲染网页时,Chromium依赖一个调度器协调Main线程和Compositor线程的执行,同时也通过这个调度器决定它们什么时候该执行什么操作.调度器将Main线程和Compositor线程的当前状态记录在一个状态机中,然后通过这个状态机决定下一个要执行的操作.这个操作在满足当前设置条件下是最优的,因此可以使网页渲染更快更流畅.本文接下来就分析Chromium网页调度器的实现. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 调度器实现

Yarn调度器负载模拟器——Yarn Scheduler Load Simulator (SLS)

一.概述: Yarn调度器有许多实现,如Fifo, Capacity和Fair schedulers等.与其同时,正在进行一些优化措施来提高调度器在不同负载和工作场景下的性能.每个调度器都有自己的特性,调度决策受许多因素影响,如公平行.计算能力保证和资源的可靠性等.在部署一个调度算法到生产集群之前,评估一个调度算法是非常重要的,不幸的是,评估一个调度算法是不那么容易的,评估一个真正的集群是非常耗费时间和成本的,并且很难找到一个足够大的集群用来评测.所以,一个可以模拟在这种工作场景和负载下调度器的

(5)调度器(scheduler)

继承关系 原理介绍 Cocos2d-x调度器为游戏提供定时事件和定时调用服务.所有Node对象都知道如何调度和取消调度事件,使用调度器有几个好处: 每当Node不再可见或已从场景中移除时,调度器会停止. Cocos2d-x暂停时,调度器也会停止.当Cocos2d-x重新开始时,调度器也会自动继续启动. Cocos2d-x封装了一个供各种不同平台使用的调度器,使用此调度器你不用关心和跟踪你所设定的定时对象的销毁和停止,以及崩溃的风险. 基础用法 游戏中我们经常会随时间的变化而做一些逻辑判断,如碰撞

Linux IO Scheduler(Linux IO 调度器)

每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request.I/O调度器的基本目的是将请求按照它们对应在块设备上的扇区号进行排列,以减少磁头的移动,提高效率.每个设备的请求队列里的请求将按顺序被响应.实际上,除了这个队列,每个调度器自身都维护有不同数量的队列,用来对递交上来的request进行处理,而排在队列最前面的request将适时被移动到请求队列中等待响应. IO调度器在内核栈中所处位置如下: 内核