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接口