目录
一、storm简介
storm是个实时的、分布式的、高容错、高可靠的计算系统。
它是由twitter开源在github上的实时大数据计算框架,2013年进入apache社区孵化,2014年成为apache的顶级金牌项目
二、storm架构
●Nimbus:资源调度、任务分配、接收jar包
●Supervisor:接收nimbus分配的任务 、 启动/停止自己管理的worker进程(当前supervisor上worker数量由配置文件设定)
●Worker:运行具体处理运算组件的进程(每个Worker对应执行一个Topology的子集)、worker任务类型,即spout任务、bolt任务两种、启动executor(executor即worker JVM进程中的一个java线程,一般默认每个executor负责执行一个task任务)
●Zookeeper:存放任务信息。用来协调Nimbus和Supervisor,如果Supervisor因故障出现问题而无法运行Topology,Nimbus会第一时间感知到,并重新分配Topology到其它可用的Supervisor上运行。
三、集群搭建及启动
下载压缩包http://storm.apache.org/downloads.html
上传到服务器,然后解压。
环境准备:
Java 6+
Python 2.6.6+
zookeeper搭建完成
部署:
在storm_home目录下新建log文件夹用于存放运行过程中产生的日志
进入到storm_home/conf目录,修改storm.yaml文件
storm.zookeeper.servers:IP1,IP2,IP3 这里是zookeeper的IP
nimbus.host: IP 这里是nimbus的ip
配置这两处就可以了,然后把整个目录拷贝到其他需要的服务器节点上
启动:
1.首先启动zookeeper。
2.在nimbus服务器上进入storm_home目录,执行命令./bin/storm nimbus >> ./logs/nimbus.out 2>&1 &
3.在Supervisor服务器上进入storm_home目录,执行命令./bin/storm supervisor >> ./logs/supervisor.out 2>&1 &
4.这时候集群就已经启动了,还可以启动ui,在任意一台节点上的storm_home下执行命令./bin/storm ui >> ./logs/ui.out 2>&1 &
5.然后通过http://ip:8080/访问
四、计算模型
1.Topology – DAG(有向无环图)
不要被这个名字欺骗觉得他是个拓扑图就不重要,相反,它是计算模型中的核心备份,就像mapreduce中的job,但是不同于job。此拓扑只要启动就会一直在集群中运行,直到手动将其kill,否则不会终止,job是计算完成后就会自动终止。
它是对于storm实时计算数据流中相互关联的spout、bolt所组成的拓扑结构的封装
2.Spout(数据源)
拓扑中数据流的来源。一般会从指定外部的数据源读取元组(Tuple)发送到拓扑(Topology)中。
Spout中最核心的方法是nextTuple,该方法会被Storm线程不断调用、主动从数据源拉取数据,再通过emit方法将数据生成元组(Tuple)发送给之后的Bolt计算
一个Spout可以发送多个数据流(Stream),可先通过OutputFieldsDeclarer中的declare方法声明定义的不同数据流,发送数据时通过SpoutOutputCollector中的emit方法指定数据流Id(streamId)参数将数据发送出去
3.Bolt(数据流处理组件)
拓扑中数据处理均有Bolt完成。对于简单的任务或者数据流转换,单个Bolt可以简单实现;更加复杂场景往往需要多个Bolt分多个步骤完成。
Bolt中最核心的方法是execute方法,该方法负责接收到一个元组(Tuple)数据、真正实现核心的业务逻辑
一个Bolt可以发送多个数据流(Stream),可先通过OutputFieldsDeclarer中的declare方法声明定义的不同数据流,发送数据时通过SpoutOutputCollector中的emit方法指定数据流Id(streamId)参数将数据发送出去
4.Stream ( 数据流)
从Spout中源源不断传递数据给Bolt、以及上一个Bolt传递数据给下一个Bolt,所形成的这些数据通道即叫做Stream
5.Tuple (元组)
Stream中最小数据组成单元就是tuple
6.Stream Grouping (数据流分组)
Storm从数据源spout到bolt时,可以选择分组策略,实现对spout发出的数据的分发。对多个并行度的时候有用。
(1)Shuffle Grouping : 随机分组,Task中的数据随机分配,可以保证同一级Blot上的每个Task处理的Tuple数量一致。
(2)None Grouping : 不分组,你不关心如何在Task中做stream的分发,目前等同于shuffle.
(3)Local or shuffle Grouping : 本地分组,如果目标Blot的一个或者多个Task和当前产生数据的Task在同一个Worker进程中,那么就走内部的线程间通信,将Tuple直接发送给当前Worker进程中的目的地Task。否则同shuffle分组。
(4)Direct grouping :直接分组,指定分组,产生数据的Spout/Bolt明确决定这个Tuple被Blot的那些task消费。使用Direct分组需要指定emitDirect来实现。
(5)Fields Grouping :按字段分组,按数据中field值进行分组;相同field值的Tuple被发送到相同的Task。
(6)All grouping :广播分组,广播发送,对于每一个tuple将会复制到每一个bolt中处理。
(7)Global grouping :全局分组,整个stream会选择一个task作为分发的目的地,通常是具有最新ID的Task。
五、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和端口号创建响应的网络连接用来发送消息。