角色

Client

client的主要作用是提交topology到集群

Worker

Worker是运行在Supervisor节点上的一个独立的JVM进程,主要作用是运行topology,一个topology可以包含多个worker,但一个worker只能属于一个topology

Exceutor

在Worker中运行的线程,一个Executor可以对应一个或多个Task,每个Task(Spout或Bolt)必须对应一个Executor。

Task

一个独立的处理逻辑的实例,每个Spout或Bolt都可以对应多个Task在集群中运行,每个线程对应到一个Executor线程上。
streaminggroup定义了如何从一堆Task发送数据到另外一堆Task上。

Storm集群的启动、任务提交与执行流程

启动

客户运行storm nimbus或storm supervisor时,在storm脚本内部实际对应了两个python函数,这两个函数最终会生成一条java命令,用于启动一个storm的java进程:

java -server xxxx.xxxx.nimbus/supervisor args
1
任务提交

运行storm java xxxx.MainClass name,此时会执行Driver驱动类的main函数
在驱动类中,会调用topologyBuilder.createTopology()方法,该方法会生成spout和bolt的序列化对象
客户端把topology对应的jar上传的到nimbus的storm-local/nimbus/inbox目录下
首先,nimbus会将storm.jar复制到/home/hadoop/storm-local/nimbus/stormdist/wordcount01-2-1525621662目录下,根据第二步生成的序列化对象生成task的序列化文件和相关配置的序列化文件(wordcount01-2-1525621662为storm生成的一个唯一的topology名称),此时,nimbus就可以进行任务分配了
-rw-rw-r--. 1 hadoop hadoop 3615 5月 6 23:47 stormcode.ser
-rw-rw-r--. 1 hadoop hadoop 733 5月 6 23:47 stormconf.ser
-rw-rw-r--. 1 hadoop hadoop 3248667 5月 6 23:47 stormjar.jar
1
2
3
接下来进行任务分配,分配完成后会产生一个assegiment对象,该对象会被序列化后保存到zookeeper的/storm/assignments/wordcount01-2-1525621662目录下

supervisor通过zookeeper的watch机制感知/storm/assignments目录变化,拉取数据自己的topology(nimbus进行分配时,会指定task所属的supervisor)

supversior根据拉取到的信息在指定端口上启动worker,实际上就是执行一条java脚本

java -server xxxxx.xxxx.worker
1
worker启动后,根据分配的task信息开始执行。

大数据学习交流群 766988146 不管你是小白还是大牛,笔者我都挺欢迎,今天的源码已经上传到群文件,不定期分享干货,
包括我自己整理的一份最新的适合2018年学习的大数据开发和零基础入门教程,欢迎初学和进阶中的小伙伴