一、任务调度策略
当我们将topology提交到storm集群的时候,任务是怎样分配的呢,这就需要理解storm的任务调度策略,这里主要给大家分享默认的调度策略DefaultScheduler,在storm的1.1.0版本已经支持4种调度策略,分别是DefaultScheduler,IsolationScheduler,MultitenantScheduler,ResourceAwareScheduler。
二、Topology的提交过程
在理解默认的调度策略之前,先看一下我们提交一个topology到集群的整个流程图。
主要分为几步:
1、非本地模式下,客户端通过thrift调用nimbus接口,来上传代码到nimbus并触发提交操作.
2、nimbus进行任务分配,并将信息同步到zookeeper.
3、supervisor定期获取任务分配信息,如果topology代码缺失,会从nimbus下载代码,并根据任务分配信息,同步worker.
4、worker根据分配的tasks信息,启动多个executor线程,同时实例化spout、bolt、acker等组件,此时,等待所有connections(worker和其它机器通讯的网络连接)启动完毕,storm集群即进入工作状态。
5、除非显示调用kill topology,否则spout、bolt等组件会一直运行。
下面我们来看一下整个topolgoy提交过程的源代码
Main方法里面的提交代码
StormSubmitter.submitTopology("one-work",config,builder.createTopology());
然后调用下面方法
public static void submitTopologyAs(String name, Map stormConf, StormTopology topology, SubmitOptions opts, ProgressListener progressListener, String asUser)
throws AlreadyAliveException, InvalidTopologyException, AuthorizationException, IllegalArgumentException {
//配置文件必须能够被Json序列化
if(!Utils.isValidConf(stormConf)) {
throw new IllegalArgumentException("Storm conf is not valid. Must be json-serializable");
}
stormConf = new HashMap(stormConf);
//将命令行的参数加入stormConf
stormConf.putAll(Utils.readCommandLineOpts());
//先加载defaults.yaml, 然后再加载storm.yaml
Map conf = Utils.readStormConfig();
conf.putAll(stormConf);
//设置zookeeper的相关权限
stormConf.putAll(prepareZookeeperAuthentication(conf));
validateConfs(conf, topology);
Map<String,String> passed