笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据助跑每一个人

storm的任务提交流程为storm知识点中的重点,因此,笔者将这些资料单独拿出来,做一次记录。

storm的总体流程图为:

storm 提交的任务如何停止启动 storm执行流程_jar

TopologyMetricsRunnable.TaskStartEvent[oldAssignment=<null>,
newAssignment=Assignment[masterCodeDir=C:\Users\MAOXIA~1\AppData\Local\Temp\\e73862a8-f7e7-41f3-883d-af494618bc9f\nimbus\stormdist\double11-1-1458909887,
nodeHost={61ce10a7-1e78-4c47-9fb3-c21f43a331ba=192.168.1.106},
taskStartTimeSecs={1=1458909910, 2=1458909910, 3=1458909910, 4=1458909910, 5=1458909910, 6=1458909910, 7=1458909910, 8=1458909910},
workers=[ResourceWorkerSlot[hostname=192.168.1.106,memSize=0,cpu=0,tasks=[1, 2, 3, 4, 5, 6, 7, 8],
jvm=<null>,nodeId=61ce10a7-1e78-4c47-9fb3-c21f43a331ba,port=6900]],timeStamp=1458909910633,type=Assign],
task2Component=<null>,clusterName=<null>,topologyId=double11-1-1458909887,timestamp=0]

 

storm 提交的任务如何停止启动 storm执行流程_数据_02

各个流程具体解释为:

storm 提交的任务如何停止启动 storm执行流程_storm 提交的任务如何停止启动_03

  1. 构建四台服务器,上面会建立管理员,叫做nimbus,用来协调任务、分配任务;
  2. 在下面的各个服务器上构建supervisor,用来处理数据;在supervisor上会启动对应的worker,每个worker对应一个端口:6700、6701、6702;每个机器都一致。
  3. Client提交任务是将其提交给nimbus,由nimbus分配任务:首先nimbus会获取空闲worker的信息,然后根据并发数分配任务(topology会产生任务信息:有一个并发数为myspout为2,mybolt1为2,mybolt2为4,worker为2等,共形成8个task,每个worker中有8/2=4个,即每个worker上有4个线程,task的划分是用taskid去取模来分配),分配完成后,将这些信息放在zk上。
  4. Supervisor中会通过watcher监听zk,topology中有三个任务类型,myspout、mybolt1、mybolt2三种,这三种类型会分配给2个worker,如上图的前两个supervisor,此时第三个supervisor会空闲;
  5. 当这个数据分配好后,开始连接外部数据源,然后开始运作,myspout连接外面的datasource,myspout随机发的话数据会通过myspout发送给两个bolt1(在两台服务器上),在bolt1上将sentence切分开,形成一个个单词,bolt1将数据分给bolt2的时候是按照field进行的,相同的单词会给到同一个bolt2上。

针对上面的解释,可以在底层的角度重新描述storm的结构为:

storm 提交的任务如何停止启动 storm执行流程_数据_04

接下来对上面的图形进行详细解释:

(一)Storm启动流程解析:

1、客户端运行storm nimbus时,会调用storm的脚本,生成一条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

2、nimbus启动之后,接受客户端提交的任务;

命令格式为: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中的main方法,main方法中会执行以下代码:

Stormsubmitter.SubmitTopology(“mywordcount”, config, topologyBuilder.createTopology());

topologyBuilder.createTopology():会将程序员编写的spout对象和bolt对象进行序列化。

会将用户的jar上传到nimbus物理节点的/export/data/storm/workdir/nimbus/inbox目录下,并且改名,改名的规则是添加了一个UUID字符串。

在nimbus物理节点的/export/data/storm/workdir/nimbus/stormdist目录下,有当前正在运行的topology的jar包和配置文件,序列化对象文件。

3、接受到任务之后,会将任务进行分配,分配会产生一个assignment对象,该对象会保存在zk中,目录是/storm/assignments/,该目录只保存正在运行的topology任务。具体的保存信息为:

storm 提交的任务如何停止启动 storm执行流程_java_05

通过上面的步骤,storm会将分配的任务存储在zk中,等待supervisor进行调用。

(二)supervisor的运行过程:

4、supervisor通过watch机制,感知到nimbus在zk上的任务分配信息,从zk上拉去任务信息,分辨出属于自己的任务,即从assignments中找到worker信息。

storm 提交的任务如何停止启动 storm执行流程_java_06

5、根据自己的任务信息,启动自己的worker,并分配一个端口号。

在启动worker的时候会进入到:

‘export /data/storm/workdir/supervisor/stormdist/wordcount-3-1461683066/stormjar.jar’

然后执行对应的命令:

‘export/servers/jdk/bin/java’ ‘-server’ ‘-Xmx768m’

‘export /data/storm/workdir/supervisor/stormdist/wordcount-3-1461683066/stormjar.jar’

‘backtype.storm.daemon.worker’ ‘wordcount-3-1461683066’

‘a69bb8fc-e08e-b51f-e539b066f90b’ ‘6701’ ‘9fac2805-7d2b-4e40-aabc-1c859856d64’

storm 提交的任务如何停止启动 storm执行流程_java_07

从这个目录中可以看到,这个目录中有三个文件是从nimbus中获取到的,放到这个目录中。

启动stormjar.jar文件中的如下的worker:

storm 提交的任务如何停止启动 storm执行流程_java_08

wordcount-3-1461683066后面的字符串a69bb8fc-e08e-b51f-e539b066f90b为UUID。

6、worker启动之后可以连接zookeeper,进入到/storm/assignments/目录中从中拉取任务。

这个worker会根据task中的任务类型进行分配:

假设任务信息为:

1----àspout----type:spout;

2----àbolt-----type:bolt;

3----àacker----type:bolt;

然后storm根据任务创建对象,创建对象的方式有几种?

New classname :创建对象;

Class.forname :反射对象;

还有克隆对象、序列化反序列化对象;

得到程序员自己定义的spout和bolt对象。

7、worker根据任务类型,分别执行spout任务和bolt任务;

spout的声明周期是:openànextTupleàoutfield;

bolt的生命周期是:prepareàexecute(tuple)àoutputfield;

(三)如何指定驱动类中每个组件的并发度数量?如何设置worker的数量?

storm 提交的任务如何停止启动 storm执行流程_storm_09

storm 提交的任务如何停止启动 storm执行流程_jar_10

并发即为上面每个值的数量。

1、根据上游的数据量来设置spout的并发度;

2、根据业务复杂度和execute方法执行时间来设置bolt并发度;

3、根据集群的可用资源来配置,一般情况下70%的资源使用率;

4、worker的数量理论上根据程序并发度总的task数量来均分,在实际的业务场景中,需要反复调整;

补充:

一个worker进程会有细节的分析:

storm 提交的任务如何停止启动 storm执行流程_java_11

有两个问题:

1、UUID是什么?

storm 提交的任务如何停止启动 storm执行流程_数据_12

在zk中,worker启动端口号的时候,就将uuid与端口号的对应关系分配好了,然后存储到suporvisor中。

2、一个worker分出的多个进程是什么?

在worker的pids目录下有多个进程,这几个进程中:第一个为jps worker的;

后面是如果这个worker启动过其他进程,此处会显示进程号;