2.4 Topology在Storm集群中分发

2016-02-24 20:42:42 10,194 0

集群模式提交Topology流程分析:

目前我们的Topology已经提交到Storm集群中运行,我们也分析了,其肯定是分配到一个supervisor的某个worker上进行运行的。但是问题是,目前我们这里有两个supervisor,每个supervisor都有4个worker。我们的wordcountapp到底是分配到那个supervisor的哪个worker上进行运行的呢?

现在我们来分析集群模式下提交Topology的流程:

1、通过storm jar ... 命令来提交Topology的jar文件到nimbus所在机器。

首先这个命令会把jar文件上传到nimnus所在的机器上。也就是说,无论这个命令是在主节点nimbus上执行的,或者是在其他的supervisor节点上执行的,都是首先上传到nimbus那台机上上。我们可以通过$STORM_HOME/logs/nimbus.log日志文件中的内容来查看。在这个日志文件中有类似以下内容:

2016-01-27 23:43:14 b.s.d.nimbus [INFO] Uploading file from client to /data/storm/nimbus/inbox/stormjar-20e3fcfc-6233-4b71-9ebb-1fe4963a7276.jar
2016-01-27 23:43:14 b.s.d.nimbus [INFO] Finished uploading file from client: /data/storm/nimbus/inbox/stormjar-20e3fcfc-6233-4b71-9ebb-1fe4963a7276.jar

实际上意思就是将我们的wordcountapp的jar文件wordcountapp-0.0.1-SNAPSHOT-jar-with-dependencies.jar上传到了/data/storm/nimbus/inbox/目录下,并且将jar文件的名称改成了stormjar-20e3fcfc-6233-4b71-9ebb-1fe4963a7276.jar。读者如果不相信的话,可以把这个文件下载下来查看一下其中的内容。

为什么会上传到这个目录呢?我们之前$STORM_HOME/conf/storm.yaml有一个配置项:

storm.local.dir: "/data/storm"

这个实际上就是就规定storm运行时如果需要存储一些数据时的顶级存储目录。顶级存储目录+/nimbus/inbox就是storm在本地存储上传的Topology的目录。

2、nimbus检查Topology配置的worker的数量等配置信息,并查询集群中可用的workers数量

当jar文件上传完成之后,storm首先会检查这个Topology的配置信息,例如需要几个worker来运行。然后storm会查询集群中可用slot(等价于worker)的数量。因为Topology需要运行在worker上,而且一个worker只能运行一个Topology,所以Storm必须先要查询那些worker事空闲的,以便将Topology分配到这些空闲的worker上。这段分析我们还可以通过分析nimbus.log的日志文件进行查看:

#检查Topology的配置信息
2016-01-27 23:43:14 b.s.d.nimbus [INFO] Received topology submission for wordcountapp with conf {"topology.max.task.parallelism" nil, "topology.acker.executors" nil, "topology.kryo.register"
nil, "topology.kryo.decorators" (), "topology.name" "wordcountapp", "storm.id" "wordcountapp-1-1453909394", "topology.debug" false, "fileName" "words.txt"}
2016-01-27 23:43:14 b.s.d.nimbus [INFO] Activating wordcountapp: wordcountapp-1-1453909394
#检查集群中可用的Slots,等价于worker
2016-01-27 23:43:14 b.s.s.EvenScheduler [INFO] Available slots: (["c612a070-af7d-4335-b034-08ae33269f3a" 6703] ["c612a070-af7d-4335-b034-08ae33269f3a" 6702] ["c612a070-af7d-4335-b034-08ae3326
9f3a" 6701] ["c612a070-af7d-4335-b034-08ae33269f3a" 6700])

3、nimbus分配任务到有空闲的worker的supervisor上

在检查完成之后,分配任务到有空闲的worker的supervisor上。在日志的体现如下:

2016-01-27 23:43:14 b.s.d.nimbus [INFO] Setting new assignment for topology id wordcountapp-1-1453909394: #backtype.storm.daemon.common.Assignment{:master-code-dir "/data/storm/nimbus/stormdi
st/wordcountapp-1-1453909394", :node->host {"c612a070-af7d-4335-b034-08ae33269f3a" "www.huhuamin.com"}, :executor->node+port {[3 3] ["c612a070-af7d-4335-b034-08ae33269f3a" 6703], [4 4] ["c612
a070-af7d-4335-b034-08ae33269f3a" 6703], [2 2] ["c612a070-af7d-4335-b034-08ae33269f3a" 6703], [1 1] ["c612a070-af7d-4335-b034-08ae33269f3a" 6703]}, :executor->start-time-secs {[1 1] 145390939
4, [2 2] 1453909394, [4 4] 1453909394, [3 3] 1453909394}}

通过这段日志,实际上我们可以看到实际上是分配到supervisor机器www.huhuamin.com上的6703端口(等价于slot和worker)上。

4、分配到任务的supervisor从nimbus上下载Topology的jar文件

前三步已经完成了分配流程,分配完成之后,因为Topology的jar文件还在nimbus所在的机器上,所以supervisor必须从nimbus上来下载这些jar文件到本地,然后才能运行。我们可以看一下supervisor.log 

#supervisor从nimbus机器上下载Topology的jar文件
2016-01-27 23:43:14 b.s.d.supervisor [INFO] Downloading code for storm id wordcountapp-1-1453909394 from /data/storm/nimbus/stormdist/wordcountapp-1-1453909394
#将下载的文件存储到/data/storm/nimbus/stormdist/wordcountapp-1-1453909394
2016-01-27 23:43:14 b.s.d.supervisor [INFO] Finished downloading code for storm id wordcountapp-1-1453909394 from /data/storm/nimbus/stormdist/wordcountapp-1-1453909394
#启动Topology
2016-01-27 23:43:14 b.s.d.supervisor [INFO] Launching worker with assignment #backtype.storm.daemon.supervisor.LocalAssignment{:storm-id "wordcountapp-1-1453909394", :executors ([3 3] [4 4] [
2 2] [1 1])} for this supervisor c612a070-af7d-4335-b034-08ae33269f3a on port 6703 with id c1cb4fc0-1906-48bf-be5e-e1b29229c89a........省略部分日志........./data/storm/supervisor/stormdist/wordcountapp-1-1453909394/stormjar.jar' 'backtype.storm.daemon.worker' 'wordcountapp-1-1453909394' 'c612a070-af7d-4335-b034-08ae33269f3a' '6703' 'c1cb4fc0-1906-48bf-be5e-e1b29229c89a'