- storm系统架构
Storm 是一个分布式的,可靠的,容错的数据流处理系统,Nimbus是调度中心,Supervisor是任务执行的地方,Supervisor上面有若干个Worker,每个Wroker都有知己的端口号,相当于一个进程.另外,每个Worker中还可以运行若干个线程.
当客户端向Storm集群提交了一个Topology时(storm javr xxxx)启动Topolpgy.如果我们是在Supervisor节点上执行(storm jar xxx),那么Supervisor会将jar包拷贝到Nimbus,之后Nimbus对Topology进行调度,Nimbus会根据Topologt所需要的Worker进行分配,将其分配到各个Supervisor的节点上执行.
Nimbus
Storm集群的Master节点,负责分发用户代码,指派给具体的Supervisor节点上的Worker节点,去运行Topology对应的组件(Spout/Bolt)的Task。
Supervisor
Storm集群的从节点,负责管理运行在Supervisor节点上的每一个Worker进程的启动和终止。通过Storm的配置文件中的supervisor.slots.ports配置项,可以指定在一个Supervisor上最大允许多少个Slot,每个Slot通过端口号来唯一标识,一个端口号对应一个Worker进程(如果该Worker进程被启动)。
Worker
运行具体处理组件逻辑的进程。Worker运行的任务类型只有两种,一种是Spout任务,一种是Bolt任务。
Task
worker中每一个spout/bolt的线程称为一个task. 在storm0.8之后,task不再与物理线程对应,不同spout/bolt的task可能会共享一个物理线程,该线程称为executor。
ZooKeeper
用来协调Nimbus和Supervisor,如果Supervisor因故障出现问题而无法运行Topology,Nimbus会第一时间感知到,并重新分配Topology到其它可用的Supervisor上运行 - storm的计算模型
Topology-DAG有向无环图
-对Storm实时计算逻辑的封装,由一系列通过数据流相互关联的Spout,Bolt所组成的拓扑结构,
-生命周期:此拓扑只要启动就会一直在集群中运行,直到手动将其Kill,否则不会终止
Tuple-元组
-Stream中最小数据单元
-从Spout中源源不断传递数据类Bolt,以及上个Bolt传递数据给下一个Bolt,所形成的这些数据通道即叫做Stream.
Spout-数据源
-拓扑中数据的来源,一般会指定外部的数据源读取元组(Tuple)发送到拓扑(Topology)中,一个Supout可以发送多个数据流(Stream)
-可以先用OutputFieldsDeclarer中的declare方法声明定义的不同数据流,发送数据时通过
SpoutOutputCollector中的emit方法指定数据流ID(StreamId)参数将数据发送出去
-Spout中最和谐的方法是nextTuple,该方法被Storm线程不断调用,主动从数据源拉取数据,再用
emit方法数据生成元组(Tuple)发送给之后的Bolt计算.
Bolt-数据处理的组件
-拓扑中数据处理均由Bolt完成,对于简单的任务或者数据流转换,单个Bolt可以简单实现,更复杂的场景往往需要多个Bolt分多个步骤完成.
-一个Bolt可以发送多个数据流(Stream)
-可以先通过OutputFieldDeclarer中的declare方法声明定义的不同数据流,发送数据时SpoutOutputCollector中的emit方法定义数据流ID,参数将数据发送出去
-Bolt最核心的方法是execute方法,该方法负责接收一个元组(Tuple)数据,真正实现核心的业务逻辑
Stream Grouping-数据流分组 - 什么是storm的流分组?有哪几种?如何分组的?
7种分组:
Shuffle grouping(随机分组):这种方式会随机分发tuple给bolt的各个task,每个bolt实例接收到的相同数量的tuple。
Fields grouping(按字段分组):根据指定字段的值进行分组。比如说,一个数据流根据“word”字段进行分组,所有具有相同“word”字段值的tuple会路由到同一个bolt的task中。
All grouping(全复制分组):将所有的tuple复制后分发给所有bolt task。每个订阅数据流的task都会接收到tuple的拷贝。
Globle grouping(全局分组):这种分组方式将所有的tuples路由到唯一一个task上。Storm按照最小的task ID来选取接收数据的task。
None grouping(不分组):在功能上和随机分组相同,是为将来预留的。
Direct grouping(指向型分组):数据源会调用emitDirect()方法来判断一个tuple应该由哪个Storm组件来接收。只能在声明了是指向型的数据流上使用。
Local or shuffle grouping(本地或随机分组):和随机分组类似,但是,会将tuple分发给同一个worker内的bolt task(如果worker内有接收数据的bolt task)。其他情况下,采用随机分组的方式。取决于topology的并发度,本地或随机分组可以减少网络传输,从而提高topology性能。 - 搭建storm分布式步骤
storm完全分布式搭建
1、配置zookeeper
2、将storm解压到/opt
3、配置:
#配置zookeeper的地址
storm.zookeeper.servers
“node1”
“node2”
“node3”
imbus的位置
nimbus.host: “node1”
指定每个supervisor上worker的通信端口
有几个端口就有几个worker
supervisor.slots.ports:
- 6700
6701
6702
6703
4、在node2和node3上分发storm包
5、将storm的bin添加到PATH中
6、启动zookeeper集群
7、启动storm的进程
node1:
nimbus
storm nimbus >> logs/nimbus.out 2>&1 &
supervisor
storm supervisor >> logs/supervisor.out 2>&1 &
ui
storm ui >> logs/ui.out 2>&1 &
node2:
supervisor
storm supervisor >> logs/supervisor.out 2>&1 &
node3:
supervisor
storm supervisor >> logs/supervisor.out 2>&1 &