前言
最近在研究Storm的任务调度相关的知识,于是就想要试着去改造一下Storm的任务调度,来满足一下现实状况中的一些场景。
Storm调度的相关术语
在看Storm的Scheduler代码么之前,得要弄明白几个概念,这样可以帮助大家更好的理解后面的调度过程。
1、slot。这代表一个Supervisor节点上的一个单位资源。每个slot对应一个port,一个slot只能被一个Worker占用。
2、Worker,Executor.Task,1个Worker包含1个或多个Executor执行器,每个执行器包含多个Task。
3、Executor的表现形式为[1-1],[2-2],中括号内的数字代表该Executor中的起始Task id到末尾Task id,1个Worker就相当于在外面加个大括号{[1-1],[2-2]}
4.Component。Storm中的每个组件就是指一类Spout或1个类型的Bolt,这里指的是名称类型,不包含个数。
下面是调度器的核心实现。
代码实现
import backtype.storm.scheduler.*; import clojure.lang.PersistentArrayMap; import java.util.*; /** * 直接分配调度器,可以分配组件到指定节点中 * Created by zhexuan on 15/7/6. */ public class DirectScheduler implements IScheduler{@Override public void prepare(Map conf) { } @Override public void schedule(Topologies topologies, Cluster cluster) { System.out.println("DirectScheduler: begin scheduling"); // Gets the topology which we want to schedule Collection<TopologyDetails> topologyDetailes; TopologyDetails topology; //作业是否要指定分配的标识 String assignedFlag; Map map; Iterator<String> iterator = null; topologyDetailes = topologies.getTopologies(); for(TopologyDetails td: topologyDetailes){ map = td.getConf(); assignedFlag = (String)map.get("assigned_flag"); //如何找到的拓扑逻辑的分配标为1则代表是要分配的,否则走系统的调度 if(assignedFlag != null && assignedFlag.equals("1")){ System.out.println("finding topology named " + td.getName()); topologyAssign(cluster, td, map); }else { System.out.println("topology assigned is null"); } } //其余的任务由系统自带的调度器执行 new EvenScheduler().schedule(topologies, cluster); } /** * 拓扑逻辑的调度 * @param cluster * 集群 * @param topology