storm

storm

Storm架构

类似于Hadoop的架构,主从(Master/Slave)
Nimbus: 主
    集群的主节点,负责任务(task)的指派和分发、资源的分配
Supervisor: 从
    可以启动多个Worker,具体几个呢?可以通过配置来指定
    一个Topo可以运行在多个Worker之上,也可以通过配置来指定
    集群的从节点,(负责干活的),负责执行任务的具体部分
    启动和停止自己管理的Worker进程
无状态,在他们上面的信息(元数据)会存储在ZK中
Worker: 运行具体组件逻辑(Spout/Bolt)的进程
=====================分割线===================
task: 
    Spout和Bolt
    Worker中每一个Spout和Bolt的线程称为一个Task
executor: spout和bolt可能会共享一个线程
提交代码到集群:
storm jar /home/hadoop/lib/storm-1.0.jar com.bigdata.ClusterSumStormTopology
storm 其他命令的使用
list
    Syntax: storm list
    List the running topologies and their statuses.
如何停止作业
    kill
        Syntax: storm kill topology-name [-w wait-time-secs]

并行度

一个worker进程执行的是一个topo的子集
一个worker进程会启动1..n个executor线程来执行一个topo的component
一个运行的topo就是由集群中多台物理机上的多个worker进程组成

executor是一个被worker进程启动的单独线程,每个executor只会运行1个topo的一个component
task是最终运行spout或者bolt代码的最小执行单元

默认:
    一个supervisor节点最多启动4个worker进程  
    每一个topo默认占用一个worker进程         
    每个worker进程会启动一个executor        
    每个executor启动一个task   

Total slots:4  
Executors: 3   但是stormUI上是 spout + bolt = 2  why 3?
隐藏的acker 导致的
通过代码对并行度的理解:
Config conf = new Config();
conf.setNumWorkers(2); // use two worker processes
topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); // set parallelism hint to 2
topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
           .setNumTasks(4)
           .shuffleGrouping("blue-spout");topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6)
           .shuffleGrouping("green-bolt");StormSubmitter.submitTopology(
    "mytopology",
    conf,
    topologyBuilder.createTopology()
);

##解释:
conf.setNumWorkers(2) --->两个worker
setSpout("blue-spout", new BlueSpout(), 2)---> 2个spout executor 对应默认的2个task
setBolt("green-bolt", new GreenBolt(), 2).setNumTasks(4) ---> 2个executor 4个task(因为它指定了setNumTasks个数)

结果:
1个topology
2个workers  
2+2+2[2个worker 就有2个acker] = 6个executors  
2+4+2[2个worker 就有2个acker默认2个task] = 8个task
修改正在运行的topology的并行度:
#Reconfigure the topology "mytopology" to use 5 worker processes,
#the spout "blue-spout" to use 3 executors 
#the bolt "yellow-bolt" to use 10 executors.

1.可以使用StormUI来rebalance the topology.
2.也可以使用命令行来修改:$ storm rebalance mytopology -n 5 -e blue-spout=3 -e yellow-bolt=10

stream grouping分组策略内置[build-in]有8种:

常用的有两种:
1.shuffle grouping 随机分配也就是轮询RoundRobin 这样不会造成数据倾斜
2.fileds grouping 比如按照字段hash取模分组 
如果想自定义分组策略:--> 自定义分组策略需要实现CustomStreamGroup接口