Storm实践
1.Storm命令
在Linux中观直接输入Storm,不带任何参数信息,可以查看Storm命令。
参考这里
1. activate
激活指定的拓扑Spout。语法:storm activate topology-name
2. classpath
打印出Storm客户端运行命令时使用的类路径(classpath),语法:storm classpath
3. deactivate
禁用指定的拓扑Spout。语法:storm deactivate topology-name
4. dev-zookeeper
以dev.zookeeper.path配置的值作为本地目录,以storm.zookeeper.port配置的值作为端口,启动一个 新的ZooKeeper服务,仅用来开发/测试。语法:storm dev-zookeeper
5. drpc
启动一个DRPC守护进程。语法:storm drpc 该命令应该使用daemontools或者monit工具监控运行。
6.help
storm help <command>
7. jar
常用命令:
样例:storm jar /storm-starter.jar storm.starter.WordCountTopology wordcountTop
命令格式:storm shell resourcesdir command args
2.定义拓扑
Topology和Nimbus
Topology是storm的核心理念,将spout和bolt组织成一个topology,运行在storm集群里,完成实时分析和计算的任务。这里我主要想介绍下topology部署到storm集群的大概过程。提交一个topology任务到Storm集群是通过StormSubmitter.submitTopology方法提交:
我们将topology打成jar包后,利用bin/storm这个python脚本,执行如下命令:
将jar包提交给storm集群。storm脚本会启动JVM执行Topology的main方法,执行submitTopology的过程。而submitTopology会将jar文件上传到nimbus,上传是通过socket传输。
1.在zookeeper上创建/taskheartbeats/{storm id} 路径,用于任务的心跳检测。storm对zookeeper的一个重要应用就是利用zk的临时节点做存活检测。task将定时刷新节点的时间戳,然后nimbus会检测这个时间戳是否超过timeout设置。
2.从topology中获取bolts,spouts设置的并行数目以及全局配置的最大并行数,然后产生task id列表,如[1 2 3 4]
3.在zookeeper上创建/tasks/{strom id}/{task id}路径,并存储task信息
4.开始分配任务(内部称为assignment), 具体步骤:
(1)从zk上获得已有的assignment(新的toplogy当然没有了)
(2)查找所有可用的slot,所谓slot就是可用的worker,在所有supervisor上配置的多个worker的端口。
(3)将任务均匀地分配给可用的worker,这里有两种情况:
(a)task数目比worker多,例如task是[1 2 3 4],可用的slot只有[host1:port1 host2:port1],那么最终是这样分配
3 : [host1:port1] 4 : [host2:port1]}
(b)如果task数目比worker少,例如task是[1 2],而worker有[host1:port1 host1:port2 host2:port1 host2:port2],那么首先会将woker排序,将不同host间隔排列,保证task不会全部分配到同一个worker上,也就是将worker排列成
(4)记录启动时间
(5)判断现有的assignment是否跟重新分配的assignment相同,如果相同,不需要变更,否则更新assignment到zookeeper的/assignments/{storm id}上。
5.启动topology,所谓启动,只是将zookeeper上/storms/{storm id}对应的数据里的active设置为true。
6.nimbus会检查task的心跳,如果发现task心跳超过超时时间,那么会重新跳到第4步做re-assignment。