Nimbus
功能:对Topology任务进行分配调度,接收用户的命令做相应的处理,submit,kill,activate,deactivate,rebalance
nimbus数据结构
java数据结构和Clojure数据结构
Nimbus中除了主服务线程之外,还有个计时器线程
作用如下:
1调用mk-assignment启动新一轮的任务分配,调用do-cleanup方法清理storm元数据,操作每隔(NIMBUS-MONITOR-FREQ-SECS)10秒执行一次。
2调用clean-inbox方法清理nimbus本地目录中topology的jar包(Cleanup-inbox-freq-secs 600s)执行一次
3执行topology的状态转移事件kill,rebalance等
mk-assignments方法会将所有的分配信息保存或更新到zookeeper中,supervisor会周期性地检查和分配这些信息,并根据这些信息做相应的调度处理
executor->node+port信息
do-cleanup
clean-inbox 清除本地目录
Topology状态转移
transition!-name->transition!
delay-event方法表示延迟一段时间后再处理转移事件,参数包括nimbus-data,storm-id,延迟执行的时间及转移事件。schedule方法
kill-transition方法定义了一个方法参数为kill-time;
rebalance-transition也返回了一个方法
启动Nimbus服务
涉及两个方法
launch-server!定义了核心的处理逻辑,启动nimbus服务
service-handler 方法是nimbus真正处理请求的地方,定义了一些数据结构,以及用于启动任务调度和数据清理的线程,它还会返回一个实现了Nimbus$Iface接口,Shutdownable接口以及DaemonCommon接口的对象,nimbus-data方法构建nimbus数据结构,调用cleanup-corrupt-topologies!方法清除哪些在ZooKeeper上还有元数据但在nimbus本地目录中没有对应文件夹的Topology,将它们遗留在ZooKepper中的记录彻底删除。
将当前所有处于活跃状态的Topology调用transition!方法,设置Topology的状态:start-up
关闭Nimbus服务
包括杀掉计时器线程,释放zookeeper连接,以及清除nimbus-data中上传下载的缓存。
Nimbus主要服务方法:
Topology的提交
submitTopology:提交一个新的Topology,并为topology创建topology-id设置一些必要的元数据,最后用mk-assignments方法为Topology分配任务
jar文件的上传与下载
nimbus作为服务器,一方面接收用户提交的Topology jar 包,另一方面还要向supervisor下达任务分配的jar包.
文件上传beginFileUpload,uploadChunk finishFileUpload
文件下载beginFileDownload和downloadChunk
UI信息
Nimbus服务器本身记录了当前集群的任务和调度信息
getClusterInfo当前集群的统计信息 :系统的资源占用情况,Nimbus服务运行了多少时间,以及当前系统中所有Topology的运行统计;
<supervisor-id,SupervisorInfo>信息构造supervisorSummary对象,参数分别为主机名,启动时间,所有可用的端口数目,使用的端口号的数目以及supervisor-id,最后返回一个SupervisorSummary集合
<topology-id,stormBase>集合
根据topology-id获取其任务分配信息,构建TopologySummary对象,其参数依次为topology-id,storm-name,所有的Task数目,所有的Executor数目,所有被占用的slot数目;
根据supervisorSummary集合,nimbus的启动时间以及TopologySummary集合,创建ClusterSummary对象并返回。
获得storm配置项和topology对象获取等基本工作
getNimbusConf直接返回JSON序列化后的nimbus-data中保存的nimbus使用的storm配置项
getTopology方法获得系统中所有的topology信息
辅助方法
system-topology!
验证提交的topology,同时添加系统组件和流
normalize-topology
计算提交的Topology中每个组件的并行度并更新该组件的Topology-tasks配置项
component-parallelism方法,用来计算组件并行度
compute-new-topology->executor->node+por
根据系统当前已经存在的分配情况,结合当前系统的运行情况找出需要进行任务分配的Topology集合,并为他们分配任务。
即<topology-id,<executor,[node,port]>>每个topology对应的任务分配情况,计算出新的集合结果
compute-executors根据当前topology设置的组件的并行度创建对应的executor.
nimbus:nimbus-data对象
storm-id:topology-id
Scheduler
是storm调度器,为topology分配当前集群中可用的资源
IScheduler接口
prepare方法
scheduler方法
Storm提供了3种scheduler-EvenScheduler,DefaultScheduler和IsolationScheduler;
EvenScheduler:将可用资源均匀地分配给当前小任务分配的多个Topology;
DefaultScheduler:是Storm默认的任务调度器首先释放掉其他topology不再需要的资源,然后调用evenScheduler方法为topology均匀分配资源;
IsolationScheduler:提供一种机制来确保集群中的某些Topology有足够的运行资源,可以单独为某个Topology指定需要的资源;
sort-slots资源列表排序
Supervisor
可以理解为单击任务调度器,负责箭筒nimbus的任务调度器,启动相应的worker对nimbus分配的任务进行处理,同时也会监听由他启动的worker的工作状态
与supervisor相关的数据结构
standalone-supervisor方法:返回一个实现了 ISupervisor接口的对象,获取和创建supervisor的id
supervisor-data方法:定义了整个supervisor代码共享数据结构,很多常用的成员变量
本地数据存储,使用LocalState在本地保存相关的信息,LocalState保存重要的数据,保证supervisor失败重启后能够正常运行
1 supervisor id
2 localAssigment
3 Approved Workers有效的<work-id,port>映射集合
Supervisor中的线程
计时器线程和两个时间线程。
计数器线程负责维持心跳,得到各个Supervisor的最新状态,同时也负责每隔一段时间将事件线程要执行的时间添加到对应的队列中。
同步nimbus任务的线程通过不断执行mk-synchronize-supervisor函数来保证supervisor与nimbus的任务同步,获取新的任务,移除旧任务
管理Worker进程的线程
启动Supervisor
通过mk-supervisor方法来启动服务Supervisor
关闭Supervisor
将运行状态设置为false,关闭计时器线程,关闭Supervisor与Nimbus同步任务的线程,关闭管理Worker的线程,释放掉与ZooJeeper的连接
几个Supervisor中重要的辅助方法
launch-worker启动worker进程,分分布式和本地模式
read-allocated-workers 用于获得worker及其对应的心跳信息,并根据心跳信息判断worker状态
wait-for-worker-launch启动worker时被调用,保证直到Worker成功启动起来后才返回
shutdown-worker该方法用于关闭Worker进程并清理Worker的本地文件夹
download-storm-code这个方法用于从Nimbus下载与分配给当前Supervisor的任务相对应的Topology信息。跟launch-worker方法类似,该方法也有两种模式— Local模式和分布式模式