Storm 任务提交的过程
client:
1.client提交topology 到Nimbus;
Nimbus:
2.提交的jar包会被上传到nimbus服务器的nimbus/inbox目录下;
3.submitTopology方法对这个topology进行处理,一般包括对storm本身以及topology的校验,检查storm的状态是否为active,检查是否已经有同名的topology已经在运行等。
4.简历topology的本地目录;
5.nimbus分配任务,根据topology定义中给定的参数,给spout/bolt设定task数据,分配对应的task-id,最后把分配好task的信息写入到zookeeper的/task目录;
6.nimbus在zookeeper上创建taskbeats目录,要求每个task定时发送心跳信息;
7.将分配好的任务,写入zookeeper,任务提交完毕;
8.将topology的信息写入到zookeeper/storms目录;
Supervisor:
1、定期扫描zookeeper上的storms目录,查看是否有新的任务;
2、删除本地不再运行的topology的代码;
3、根据nimbus指定的任务信息启动worker进行工作;
Worker:
1.查看乣执行哪些任务;
2.根据taskid分辨出spout、bolt;
3.计算出所代表的的spout/bolt会给哪些task发送消息;
4.根据ip和端口号创建响应的网络连接用来发送消息。
Storm启动流程分析
client
1、客户端运行storm nimbus时,会调用storm的python脚本,该脚本中为每个命令编写一个方法,每个方法都可以生成一条相应的java命令。
命令格式如下:
java -server xxxx.ClassName -args
nimbus---> Running: /export/servers/jdk/bin/java -server backtype.storm.daemon.nimbus
supervisor---> Running: /export/servers/jdk/bin/java -server backtype.storm.daemon.supervisor
nimbus
2、nibums启动之后,接受客户端提交任务
命令格式:storm jar xxx.jar xxx驱动类 参数
Running: /export/servers/jdk/bin/java -client -Dstorm.jar=/export/servers/storm/examples/storm-starter/storm-starter-topologies-0.9.6.jar storm.starter.WordCountTopology wordcount-28
该命令会执行 storm-starter-topologies-0.9.6.jar 中的storm-starter-topologies-0.9.6.jar的main方法,main方法中会执行以下代码:
StormSubmitter.submitTopology("mywordcount",config,topologyBuilder.createTopology());
topologyBuilder.createTopology(),会将client编写的spout对象和bolt对象进行序列化。
将用户的jar上传到 nimbus物理节点的 /export/data/storm/workdir/nimbus/inbox目录下。并且改名,改名的规则是添加了一个UUID字符串。
在nimbus物理节点的 /export/data/storm/workdir/nimbus/stormdist目录下。有当前正在运行的topology的jar包和配置文件,序列化对象文件。
3、nimbus接受到任务之后,会将任务进行分配,分配会产生一个assignment对象,该对象会保存到zk中,目录是/storm/assignments ,该目录只保存正在运行的topology任务。
supervisor
4、supervisor通过watch机制,感知到nimbus在zk上的任务分配信息,从zk上拉取任务信息,分辨出属于自己任务。
5、supervisor 根据自己的任务信息,启动自己的worker,并分配一个端口。
worker
6、worker启动之后,连接zk,拉取任务.
worker通过反序列化,得到程序员自己定义的spout和bolt对象。
7、worker根据任务类型,分别执行spout任务或者bolt任务。
spout的生命周期是:open、nextTuple、outPutFiled
bolt的生命周期是:prepare、execute(tuple)、outPutFiled