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 &