定位
supervisor在整个jstorm集群中主要是作用类似一个小管家:管理一台机器上的任务,包括从zookeeper上来负责领取任务、管理本机上的work、汇报本机信息到zookeeper上
结构
整体结构比较简单
private final String hostName; //机器的名称
private final String supervisorId; //唯一的id,通过随机数生成,格式: xxxxxxxx_xxxx_xxxx_xxxx_xxxxxxxxxxxx
private Integer timeSecs; //上次心跳检测的时间
private Integer uptimeSecs; //上次心跳检测离superviosr启动的时间
private Set<Integer> workerPorts; //work的端口
private transient Set<Integer> availableWorkerPorts; //空闲的work
分析
启动
启动过程代码
Map<Object, Object> conf = Utils.readStormConfig();
//是否分布式模式
StormConfig.validate_distributed_mode(conf);
//目录中写入pid
createPid(conf);
supervisorManager = mkSupervisor(conf, null);
JStormUtils.redirectOutput("/dev/null");
initShutdownHook(supervisorManager);
while (supervisorManager.isFinishShutdown() == false) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
大概分为几个过程:
1 获取配置文件
2 检测启动的模式,因为只有在分布式模式下才会有supervisor,本地模式不需要
3 把进程的id为文件名,在本地创建对应的文件 (后面详细介绍)
4 创建和启动supervisor(详细介绍)
5 最后不断检测这个进程是否结束了