Storm 并发机制

    Worker  –  进程
        一个Topology拓扑会包含一个或多个Worker(每个Worker进程只能从属于一个特定的Topology)
        这些Worker进程会并行跑在集群中不同的服务器上,即一个Topology拓扑其实是由并行运行在Storm集群中多台服务器上的进程所组成
    Executor – 线程
        Executor是由Worker进程中生成的一个线程
        每个Worker进程中会运行一个或多个拓扑当中的Executor线程
        一个Executor线程中可以执行一个或多个Task任务(默认每个Executor只执行一个Task任务),但是这些Task任务都是对应着同一个组件(Spout、Bolt)。
    Task
        实际执行数据处理的最小单元
        每个task即为一个Spout或者一个Bolt

Task数量在整个Topology生命周期中保持不变,Executor数量可以变化或手动调整
(默认情况下,Task数量和Executor是相同的,即每个Executor线程中默认运行一个Task任务)
    

(1)设置并行度
    设置Worker进程数
Config.setNumWorkers(int workers)
    设置Executor线程数
TopologyBuilder.setSpout(String id, IRichSpout spout, Number parallelism_hint)
TopologyBuilder.setBolt(String id, IRichBolt bolt, Number parallelism_hint)
其中, parallelism_hint即为executor线程数
    设置Task数量
ComponentConfigurationDeclarer.setNumTasks(Number val)

    例:

Config conf = new Config() ;
conf.setNumWorkers(2);

TopologyBuilder topologyBuilder = new TopologyBuilder();
topologyBuilder.setSpout("spout", new MySpout(), 1);
topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2).setNumTasks(4).shuffleGrouping("blue-spout);

(2)Rebalance – 再平衡

        即,动态调整Topology拓扑的Worker进程数量、以及Executor线程数量

    支持两种调整方式:

            1、通过Storm UI

            2、通过Storm CLI

    通过Storm CLI动态调整:

            例:storm rebalance mytopology -n 5 -e blue-spout=3 -e yellow-bolt=10

                        将mytopology拓扑worker进程数量调整为5个

                        “ blue-spout ” 所使用的线程数量调整为3个

                        “ yellow-bolt ”所使用的线程数量调整为10个




Storm 通信机制

    Worker进程间的数据通信

            ZMQ

                ZeroMQ 开源的消息传递框架,并不是一个MessageQueue

            Netty

                Netty是基于NIO的网络框架,更加高效。(之所以Storm 0.9版本之后使用Netty,是因为ZMQ的license和Storm的license不兼容。)

    Worker内部的数据通信

            Disruptor

                实现了“队列”的功能。

                可以理解为一种事件监听或者消息处理机制,即在队列当中一边由生产者放入消息数据,另一边消费者并行取出消息数据处理。 

 




Storm 容错机制
1、集群节点宕机
        Nimbus服务器
                单点故障?
        非Nimbus服务器
                故障时,该节点上所有Task任务都会超时,Nimbus会将这些Task任务重新分配到其他服务器上运行
2、进程挂掉
        Worker
                挂掉时,Supervisor会重新启动这个进程。如果启动过程中仍然一直失败,并且无法向Nimbus发送心跳,Nimbus会将该Worker重新分配到其他服务器上
        Supervisor
                无状态(所有的状态信息都存放在Zookeeper中来管理)
                快速失败(每当遇到任何异常情况,都会自动毁灭)
        Nimbus
                无状态(所有的状态信息都存放在Zookeeper中来管理)
                快速失败(每当遇到任何异常情况,都会自动毁灭)
3、消息的完整性
                                    
       
        从Spout中发出的Tuple,以及基于他所产生Tuple(例如上个例子当中Spout发出的句子,以及句子当中单词的tuple等)
        由这些消息就构成了一棵tuple树
        当这棵tuple树发送完成,并且树当中每一条消息都被正确处理,就表明spout发送消息被“完整处理”,即消息的完整性
    Acker -- 消息完整性的实现机制
        Storm的拓扑当中特殊的一些任务。  ——负责跟踪每个Spout发出的Tuple的DAG(有向无环图)
        bolt执行excute会调用ack,失败调用fail,通过 对Tuple携带的 MsgID 做异或 为 0 则消息完整,1 消息不完整,消息重新发送
        虽然这样消息不会丢失,但是可能会造成消息重复

添加新评论