35-Storm学习-Storm教程:纯手工集群部署Storm


上一章节讲了如何手写一个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集群

安装一个Storm步骤如下:

  • (1)安装Java 7以上和Pythong 2.6.6以上

java和Pythong的安装其实很简单,不会的可以百度一下。

可以利用命令 java -v 和 python 命令查看是否有安装好。

  • (2)下载storm安装包,解压缩,重命名,配置环境变量

下载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

  • (3)修改storm配置文件

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

35-Storm学习-Storm教程:纯手工集群部署Storm_第1张图片

 

三台机器都部署了Storm的话都要配置一遍。

  • (4)启动storm集群和ui界面

 

>/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 &

 

 

  • (5)访问一下ui界面,8080端口
    在浏览器中输入链接http://192.168.209.161:8080,如下图所示:

六、问题及解决方案

 

  • 1、Failed to Sync Supervisor
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 即可解决问题

  • 2、有多个 supervisor 但 storm ui 上只显示一个

具体现象就是启动了多个 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。

  • 3、Could not find or load main class org.apache.storm.starter.ExclamationTopology

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 是正确的

 

提交作业到storm集群来运行

将工程,进行打包,打成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

如果启动报错如图:

35-Storm学习-Storm教程:纯手工集群部署Storm_第2张图片

说明打包后的jar中有多个yaml文件,所以报错。

解决办法:在storm的依赖中加上scope

     
          org.apache.storm
          storm-core
          2.0.0
          provided
     

(2)在storm ui上观察storm作业的运行

35-Storm学习-Storm教程:纯手工集群部署Storm_第3张图片

(3)kill掉某个storm作业

         storm kill topology-name

         例如: storm kill wordCountTopology   干掉这个拓扑

你可能感兴趣的:(#)