storm-流式处理框架

  1. 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上运行

  2. 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-数据流分组

  3. 什么是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性能。

  4. 搭建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 &

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值