Storm 启动流程
1.客户端运行 storm nimbus时,会调用 storm 的python脚本,该脚本为每个命令编写一个方法,每个方法都可以生成一条相应的java命令。
命令格式:
java -server xxx.ClassName -args
nimbus -----> Running: /export/servers/jdk/bin/java -server backtype.storm.deamon.nimbus
supervisor--> Running: /export/servers/jdk/bin/java -server backtype.storm deamon.supervisor
2.nimbus 启动之后,接受客户端提交任务
命令格式:
storm jar xxx.jar xxx驱动类 参数
该命令会执行 jar 包中的 main 方法,main 方法中会执行以下代码:
- StormSubmitTopology(“mywordcount”,config,topologyBuilder.createTopology())
topologyBuilder.createTopology() 会将程序员写的 spout 对象 和 bolt 对象进行序列化。会将用户的jar上传到 nimbus 物理节点的 /export/data/storm/workdir/nimbus/inbox 目录下,并且改名,改名规则是添加一个UUID字符串。
在 nimbus 物理节点 /export/data/storm/workdir/nimbus/stormdist 目录下,有当前正在运行的 topology 的jar 包和配置文件,序列化对象文件。
3.然后进行任务分配,分配会产生一个 assignment 对象,该对象会保存到 zk中,目录是 /storm/assignments,该目录只保存正在运行的 toipology任务。
4.supervisor 通过 watch 机制,感知到 nimbus 在 zk 上的任务分配信息,从zk上拉取任务信息,分辨出属于自己的任务。
5.根据自己的任务信息,启动自己的 worker,并分配一个端口。
6.worker 启动之后,连接 zk ,拉取任务。 worker 通过反序列化,得到程序员自己定义的 spout 和 bolt 对象。
7.worker 根据任务类型,分别执行 spout 任务 或者 bolt 任务。
spout 的生命周期是:open, nextTuple, outPutFiled
bolt 的生命周期是:prepare, execute(tuple), outPutFiled
提交成功,ui页面
任务状态修改
查找任务名称,点击进入任务详情
修改任务状态即可
问题(ClassNotFound异常)
1.本地可以读取本地文件系统及java项目中的文件,但是提交集群后就不能读取了,storm只是将topology提交到了集群,所以只能在main方法中将需要读取的配置在提交topology之前读出来,然后再解析,而不是在spout和bolt中读取配置文件;
2.外部jar包也不会提交到集群,会有ClassNotFound异常,解决办法是将依赖包全部放进集群storm目录的lib目录下。
3.提交:storm jar .###.jar 包明.主类名 然后在ip:8080/index.html页面查看topology运行情况