上一章节讲了如何手写一个storm wordcount程序:34-Storm学习-Storm教程:纯手敲WordCount程序
蕴含了很多的知识点,如下:
(1)Spout
(2)Bolt
(3)OutputCollector,Declarer
(4)Topology
(5)设置worker,executor,task,流分组
storm的核心基本原理,基本的开发,我们已经了解了,忘记的时候我们可以返回去看一下。
接下来,我们来了解下storm集群部署,怎么将storm的拓扑扔到storm集群上去运行,这次真正实现了一个实时计算的一个Strom项目。
安装一个Storm步骤如下:
java和Pythong的安装其实很简单,不会的可以百度一下。
可以利用命令 java -v 和 python 命令查看是否有安装好。
下载storm安装包并解压:tar -zxvf apache-storm-1.1.0.tar.gz
删掉压缩包,重命名: mv apache-storm-1.1.0 storm
配置环境变量:vim /etc/profile
STORM_HOME=/usr/local/apache-storm-1.1.1
PATH=$JAVA_HOME/bin:$STORM_HOME/bin:$PATH
export JAVA_HOME HADOOP_HOME CLASS_PATH PATH STORM_HOME
mkdir /var/storm
conf/storm.yaml
# 主要修改点: zookeeper 的 列表地址
storm.zookeeper.servers:
- "192.168.1.51"
- "192.168.1.52"
- "192.168.1.53"
# 主要修改点: storm本地的一个目录
storm.local.dir: "/mnt/storm"
# 主要修改点: nimbus的地址
nimbus.seeds: ["192.168.1.51"]
# 主要修改点:slots.ports,指定每个机器上可以启动多少个worker,一个端口号代表一个worker
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
三台机器都部署了Storm的话都要配置一遍。
>/dev/null
这条命令的作用是将标准输出1重定向到/dev/null中。/dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”。那么执行了
>/dev/null
之后,标准输出就会不再存在,没有任何地方能够找到输出的内容。2>&1
这条命令用到了重定向绑定,采用&可以将两个输出绑定在一起。这条命令的作用是错误输出将和标准输出同用一个文件描述符,说人话就是错误输出将会和标准输出输出到同一个地方。
192.168.1.51 后台运行 nimbus
bin/storm nimbus >/dev/null 2>&1 &
192.168.1.51 192.168.1.52 192.168.1.53后台运行 supervisor
bin/storm supervisor >/dev/null 2>&1 &
在supervisor节点上,需要启动logviewer,然后才能看到日志。
storm logviewer >/dev/null 2>&1 &
192.168.1.51 后台运行 storm ui
storm ui 得要在 nimbus 机子上运行,不能够在 supervisor 机子上运行
bin/storm ui >/dev/null 2>&1 &
16373 [Thread-10] ERROR o.a.s.d.s.ReadClusterState - Failed to Sync Supervisor
java.lang.RuntimeException: java.lang.InterruptedException
at org.apache.storm.utils.Utils.wrapInRuntime(Utils.java:1531) ~[storm-core-1.1.1.jar:1.1.1]
at org.apache.storm.zookeeper.zookeeper.getChildren(zookeeper.java:265) ~[storm-core-1.1.1.jar:1.1.1]
at org.apache.storm.cluster.ZKStateStorage.get_children(ZKStateStorage.java:174) ~[storm-core-1.1.1.jar:1.1.1]
at org.apache.storm.cluster.StormClusterStateImpl.assignments(StormClusterStateImpl.java:153) ~[storm-core-1.1.1.jar:1.1.1]
at org.apache.storm.daemon.supervisor.ReadClusterState.run(ReadClusterState.java:126) [storm-core-1.1.1.jar:1.1.1]
at org.apache.storm.event.EventManagerImp$1.run(EventManagerImp.java:54) [storm-core-1.1.1.jar:1.1.1]
Caused by: java.lang.InterruptedException
at java.lang.Object.wait(Native Method) ~[?:1.8.0_91]
at java.lang.Object.wait(Object.java:502) ~[?:1.8.0_91]
at org.apache.storm.shade.org.apache.zookeeper.ClientCnxn.submitRequest(ClientCnxn.java:1342) ~[storm-core-1.1.1.jar:1.1.1]
at org.apache.storm.shade.org.apache.zookeeper.ZooKeeper.getChildren(ZooKeeper.java:1588) ~[storm-core-1.1.1.jar:1.1.1]
at org.apache.storm.shade.org.apache.zookeeper.ZooKeeper.getChildren(ZooKeeper.java:1625) ~[storm-core-1.1.1.jar:1.1.1]
at org.apache.storm.shade.org.apache.curator.framework.imps.GetChildrenBuilderImpl$3.call(GetChildrenBuilderImpl.java:226) ~[storm-core-1.1.1.jar:1.1.1]
at org.apache.storm.shade.org.apache.curator.framework.imps.GetChildrenBuilderImpl$3.call(GetChildrenBuilderImpl.java:219) ~[storm-core-1.1.1.jar:1.1.1]
at org.apache.storm.shade.org.apache.curator.RetryLoop.callWithRetry(RetryLoop.java:109) ~[storm-core-1.1.1.jar:1.1.1]
at org.apache.storm.shade.org.apache.curator.framework.imps.GetChildrenBuilderImpl.pathInForeground(GetChildrenBuilderImpl.java:216) ~[storm-core-1.1.1.jar:1.1.1]
at org.apache.storm.shade.org.apache.curator.framework.imps.GetChildrenBuilderImpl.forPath(GetChildrenBuilderImpl.java:207) ~[storm-core-1.1.1.jar:1.1.1]
at org.apache.storm.shade.org.apache.curator.framework.imps.GetChildrenBuilderImpl.forPath(GetChildrenBuilderImpl.java:40) ~[storm-core-1.1.1.jar:1.1.1]
at org.apache.storm.zookeeper.zookeeper.getChildren(zookeeper.java:260) ~[storm-core-1.1.1.jar:1.1.1]
... 4 more
部署的 storm 服务器版本为 1.1.1,而提交给 storm 跑的 jar 包为:storm-starter-1.0.2.jar。版本不对应导致上面的问题。应该是 storm-core-1.1.1.jar 的代码与 storm-core-1.0.2.jar 相差较大,或者修改了通信的协议导致。将 storm 服务器版本修改为 1.0.0 即可解决问题
具体现象就是启动了多个 supervisor,单在 ui 上只显示一个(也有可能是多个 supervisor 中的某几个看上去被“合并”了),kill 掉其中任意一个 supervisor,另一个就出现。
例如本例中有两个 supervisor,192.168.1.52 和 192.168.1.53,但是通过接口请求,每次都只会显示其中的一个,但是现实的机子是交替出现的:
解决方案:storm.yaml 文件中有配置 storm.local.dir: "/usr/local/apache-storm-1.1.1/data",local.dir 所指目录,重启即可解决问题。原因是由于部署时通过 linux scp 命令直接分发软件到其他机子,残留了 local.dir 的东西,而 storm 是根据 local.dir 中的某一个或一些文件计算出一个 supervisor id 的。删除 local.dir 后,会重新生成 id。
bin/storm jar /usr/local/apache-storm-1.1.1/storm-starter-1.0.2.jar org.apache.storm.starter.ExclamationTopology et
第一确保 storm-starter-1.0.2.jar 的路径是正确的;第二保证 packagename.ExclamationTopology,包名packagename 与 类名 ExclamationTopology 是正确的
将工程,进行打包,打成jar包
(1)提交作业到storm集群
storm jar path/to/allmycode.jar org.me.MyTopology arg1 arg2 arg3
例如:./storm/bin/storm jar storm-helloworld-0.0.1-SNAPSHOT.jar com.roncoo.eshop.storm.WordCountTopology wordCountTopology
如果启动报错如图:
说明打包后的jar中有多个yaml文件,所以报错。
解决办法:在storm的依赖中加上scope
org.apache.storm storm-core 2.0.0 provided
(2)在storm ui上观察storm作业的运行
(3)kill掉某个storm作业
storm kill topology-name
例如: storm kill wordCountTopology 干掉这个拓扑