storm

storm

​ Storm是一个分布式、高容错、高可靠性的实时计算系统,它对于实时计算的意义相当于Hadoop对于批处理的意义。Hadoop提供了Map和Reduce原语。同样,Storm也对数据的实时处理提供了简单的spout和bolt原语。

​ Storm集群表面上看和Hadoop集群非常像,但Hadoop上面运行的是MapReduce的Job,而Storm上面运行的是topology(拓扑),它们非常不一样,比如一个MapReduce的Job最终会结束,而一个Storm topology永远运行(除非显式杀掉它)。

详述storm系统架构

基本概念

​ Storm中服务器节点分为主节点和从节点,Nimbus为主节点和 Supervisor为从节点。以及若干组件构成。下面为对一些术语进行简单的介绍:
​ Nimbus:主节点,是一个调度中心,负责分发任务
​ Supervisor:从节点,任务执行的地方
​ Worker:任务工作进程,一个Supervisor中可以有多个Worker。
​ Executor:Worker进程在执行任务时,会启动多个Executor线程 。
​ Topology:任务的抽象概念。由于storm是流式计算的框架,它的数据流和拓扑图很像,所以它的任务就叫topology。
​ Spout:从数据源获取数据并进行分发。
​ Bolt:得到Spout或者上一个Bolt的数据,然后进行处理后交给下一个Bolt处理。

​ Tuple:在storm中,一条数据可以理解为是一个Tuple。

任务提交处理流程

​ Nimbus是调度中心,Supervisor是任务执行的地方。Supervisor上面有若干个Worker,每个Worker都有自己的端口,Worker可以理解为一个进程。另外,每个Worker中还可以运行若干个线程。

​ 当客户端向storm集群提交一个Topology时,这里的提交就是在集群上通过命令storm jar xxx启动topology。如果我们是在Supervisor节点上执行storm jar xxx,那么Supervisor会将jar包拷贝到Nimbus,之后Nimbus对Topology进行调度。

​ Nimbus会根据Topology所需要的Worker进行分配,将其分配到各个Supervisor的节点上执行。

Storm架构如下图所示:

img

​ 1、主控节点(Master Node)

​ 运行Storm nimbus后台服务的节点(Nimbus),它是storm系统的中心,负责接收用户提交的作业(如同spark submit一样 即为jar包形式保存的topology代码),通过Zookeeper向每个工作节点分配处理任务(有进程级的也有线程级别的)

​ 2、工作节点(Work Node)

运行Storm supervisor后台服务的节点。用来监听nimbus分配的任务并下载作业副本,启动、暂停或撤销任务的工作进程及其线程。其中工作进程执行指定topology的子集,而同一个topology可以由多个工作进程完成;一个工作进程由多个工作线程组成,工作线程是spout/bolt的运行时实例,数量是由spout/bolt的数目及其配置确定。

​ 3、控制台节点(Web console Node)

运行storm UI后台服务的节点。实际上是一个Web服务器,在指定端口提供页面服务。用户可以通过使用浏览器访问控制台节点的Web页面,提交、暂停和撤销作业,也可以以只读的形式获取系统配置、作业及各个组件的运行时状态。(如果需要实现作业的管理,Storm UI须和Storm nimbus部署在同一台机器上,UI进程会检查本机是否存在nimbus的连接,若不存在可导致UI部分功能无法正常工作.)

​ 4、协调节点(Coordinate Node)

​ 运行Zookeeper进程的节点,numbus和supervisor之间所有的协调,包括分布式状态维护和分布式配置管理,都是通过该协调节点实现的。

详述storm的计算模型

1561370129123

1561370140256

​ DAG计算模型,一个阶段接另一个阶段再接另一个阶段,在这个有向无环图里面可以灵活的组合,DAG是由Spout和bolt组合起来的,它们都是节点,是stream数据流,数据流里面的数据单元就是Tuple。
​ Storm里面关键的组件,有nimbus/supervisor/worker/executor,另外storm还用到了外围的组件zookeeper来存储协调数据。

​ 在Storm中最重要的就是topology,topology就是对于DAG模型的一个实现。

Topology – DAG有向无环图的实现
对于Storm实时计算逻辑的封装
即,由一系列通过数据流相互关联的Spout、Bolt所组成的拓扑结构
生命周期:此拓扑只要启动就会一直在集群中运行,直到手动将其kill,否则不会终止(区别于MapReduce当中的Job,MR当中的Job在计算执行完成就会终止)

Tuple – 元组
Stream中最小数据组成单元

Stream – 数据流
​ 从Spout中源源不断传递数据给Bolt、以及上一个Bolt传递数据给下一个Bolt,所形成的这些数据通道即叫做Stream
Stream声明时需给其指定一个Id(默认为Default)
实际开发场景中,多使用单一数据流,此时不需要单独指定StreamId

Spout – 数据源
​ 拓扑中数据流的来源。一般会从指定外部的数据源读取元组(Tuple)发送到拓扑(Topology)中
​ 一个Spout可以发送多个数据流(Stream)
​ 可先通过OutputFieldsDeclarer中的declare方法声明定义的不同数据流,发送数据时通过SpoutOutputCollector中的emit方法指定数据流Id(streamId)参数将数据发送出去
​ Spout中最核心的方法是nextTuple,该方法会被Storm线程不断调用、主动从数据源拉取数据,再通过emit方法将数据生成元组(Tuple)发送给之后的Bolt计算

Bolt – 数据流处理组件
​ 拓扑中数据处理均有Bolt完成。对于简单的任务或者数据流转换,单个Bolt可以简单实现;更加复杂场景往往需要多个Bolt分多个步骤完成
一个Bolt可以发送多个数据流(Stream)
​ 可先通过OutputFieldsDeclarer中的declare方法声明定义的不同数据流,发送数据时通过SpoutOutputCollector中的emit方法指定数据流Id(streamId)参数将数据发送出去
​ Bolt中最核心的方法是execute方法,该方法负责接收到一个元组(Tuple)数据、真正实现核心的业务逻辑。

详述什么是storm的流分组?有哪几种?如何分组的?

​ 流分组是拓扑定义的一部分,每个Bolt指定应该接收哪个流作为输入。流分组定义了流/元组如何在Bolt的任务之间进行分发。在设计拓扑的时候需要定义数据如何在组件之间进行交换(流如何被Bolt消耗处理)。
一个流分组指定每个Bolt消耗哪个流。一个节点可以发出多个数据流,流分组允许我们有选择的接收流进行消耗处理。
​ Storm内置了7种流分组方式和一个自定义分组方式(由InputDeclarer接口定义)。

​ 流分组的方式主要有fieldsGrouping(字段分组)、globalGrouping(全局分组)、shuffleGrouping(随机分组)、localOrShuffleGrouping(本地或随机分组)、noneGrouping(无分组)、allGrouping(广播分组)、directGrouping(直接分组)、customGrouping(自定义分组)这8种不同的流分组方式。

Fields grouping(字段分组):根据指定字段的值进行分组。比如说,一个数据流根据“word”字段进行分组,所有具有相同“word”字段值的tuple会路由到同一个bolt的task中。

Globle grouping(全局分组):这种分组方式将所有的tuples路由到唯一一个task上。Storm按照最小的task ID来选取接收数据的task。

Shuffle grouping(随机分组):这种方式会随机分发tuple给bolt的各个task,每个bolt实例接收到的相同数量的tuple。

Local or shuffle grouping(本地或随机分组):和随机分组类似,但是,会将tuple分发给同一个worker内的bolt task(如果worker内有接收数据的bolt task)。其他情况下,采用随机分组的方式。取决于topology的并发度,本地或随机分组可以减少网络传输,从而提高topology性能。

None grouping(无分组):在功能上和随机分组相同,是为将来预留的。

All Grouping(广播分组):流分组发送到所有的Bolt的任务中。对于每一个tuple,所有的bolts都会收到。

Direct Grouping(直接分组):是一种特殊的分组。这种方式的流分组一维这由元组的生产者决定元组的消费者的接收元组的任务。直接分组只能在已经声明为直接流(Direct Stream)的流中使用,并且元组必须使用emitDirect方法来发射。Bolt通过TopologyContext对象或者OutputCollector类的emit方法的返回值可以获取到其消费者的任务ID列表(List)。
Custome Grouping(自定义分组):通过实现CustomStreamGrouping接口可以实现自定义的流分组,接口定义如下:
​ public interface CustomStreamGrouping extends Serializable {
​ void prepare(WorkerTopologyContext context, GlobalStreamId stream, List targetTasks);
​ List chooseTasks(int taskId, List values);
​ }

搭建storm分布式步骤

1、配置zookeeper
2、将storm解压到/opt
3、配置:
​ #配置zookeeper的地址
​ storm.zookeeper.servers:

​ “node 1”

​ “node 2”

​ “node 3”

​ #nimbus的位置

 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 &

​ 在三台服务器上启用logviewer查看日志信息:
​ 在storm ui上直接查看日志信息:
​ storm logviewer >> logs/logviewer.out 2>&1 &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值