您的位置:首页 > 其它

Storm——集群部署

2015-10-26 09:42 253 查看
先简单的把本文要做的事罗列一下:

1. 安装zookeeper集群

2. 安装Storm集群,包括一个Storm的nimbus,在nimbus上启用Storm UI 和两个supervisor

3. 跑一个小例子证实安装完成

注:

本例中,nimbus机器IP为10.1.110.24, 两个supervisor分别为10.1.110.21和10.1.110.22。后文不再用通配符写IP。请自行更换IP。

准备工作

1. 下载zookeeper3.4.5(如果你比较懒,猛击这里
2. 下载Storm当前最新0.9.0.1 apache-storm-0.9.2-incubating(猛击这里
3. 安装被配置好JDK(最低版本1.6)

注:
Storm0.9之前的版本,底层通讯用的是ZeroMQ,所以还得去装一个老版本的ZeroMQ(2.1.7,不能装太新的)。
由于ZeroMQ的各种问题,新版支持用Netty替代ZeroMQ。性能上据说能提高两倍。但是默认仍是ZeroMQ,Netty方式需要配置来启用。
github上面安装文档并没有更新,所以,如果要装老版的,可以参考这里:
https://github.com/nathanmarz/storm/wiki/Installing-native-dependencies

新版的release note:http://storm-project.net/2013/12/08/storm090-released.html

2014-07-29  新加注释:

Storm现在移交到Apach了,新release的apache-storm-0.9.1-incubating直接将Netty换成了默认方式(更多更新参见这里)。

所以启用Netty部分的messaging部分的参数可以不带了。

安装ZK

1. 登陆到10.1.110.21并解压tar包(注意给执行权限)
2. 建立zookeeper的data目录,本文以 /var/tmp/zkdata 为例

[plain]
view plaincopyprint?





mkdir -p /var/tmp/zkdata  

3. 建立zk集群的myid文件 (单机版可以跳过该步)

[plain]
view plaincopyprint?





cd /var/tmp/zkdata  
echo 1 > myid  

4. 拷贝zookeeper的conf/zoo_sample.cfg并重命名为zoo.cfg,修改如下:

[plain]
view plaincopyprint?





# The number of milliseconds of each tick  
tickTime=2000  
# The number of ticks that the initial   
# synchronization phase can take  
initLimit=10  
# The number of ticks that can pass between   
# sending a request and getting an acknowledgement  
syncLimit=5  
# the directory where the snapshot is stored.  
# do not use /tmp for storage, /tmp here is just   
# example sakes.  
dataDir=/var/tmp/zkdata  
# the port at which the clients will connect  
clientPort=2181  
server.1=10.1.110.21:2888:3888  
server.2=10.1.110.22:2888:3888  
server.3=10.1.110.24:2888:3888  
## Be sure to read the maintenance section of the   
# administrator guide before turning on autopurge.  
## http://zookeeper.apache.org/doc/current/zookeeperAdmin.html  
#sc_maintenance  
## The number of snapshots to retain in dataDir  
#autopurge.snapRetainCount=3  
# Purge task interval in hours  
# Set to "0" to disable auto purge feature  
#autopurge.purgeInterval=1  

dataDir是配置zk的数据目录的
server.A=B:C:D是集群zk使用的。如果你只想用单个zk,可以不配置。
A - 是一个数字,表示这是第几号服务器。与/var/tmp/zkdata下的myid文件内容一致
B - 是该服务器的IP地址
C - 表示该服务器与集群中的Leader服务器交换信息的端口
D - 表示如果万一集群中的Leader服务器挂了,需要各服务器重新选举时所用的通讯端口

5.  (Optional)将zk的bin目录路径加入环境变量
修改/etc/profile文件,在尾部添加如下:

[plain]
view plaincopyprint?





#zookeeper  
export ZOOKEEPER=/opt/zookeeper-3.4.5  
PATH=$PATH:$ZOOKEEPER/bin  

使其生效

6. 启动zk

[plain]
view plaincopyprint?





cd /opt/zookeeper-3.4.5/bin  
./zkServer.sh start  

在剩下两台机器重复以上步骤,注意myid要对应

安装Storm

1. 解压tar包并赋予执行权限
2. 将Storm的bin目录加入系统路径
修改/etc/profile文件,在尾部加入如下:

[plain]
view plaincopyprint?





PATH=$PATH:/opt/storm-0.9.0.1/bin  

使其生效

3. 创建一个Storm的本地数据目录

[plain]
view plaincopyprint?





mkdir -p /var/tmp/storm/workdir/  

以上步骤在Storm的集群上的其他机器上重复执行,然后进行配置:
a. 配置nimbus
修改storm的conf/storm.yaml文件如下:

[plain]
view plaincopyprint?





########### These MUST be filled in for a storm configuration  
 storm.zookeeper.servers:  
     - "10.1.110.21"  
     - "10.1.110.22"  
     - "10.1.110.24"  
  
  
#  
# nimbus.host: "nimbus"  
#  
#  
# ##### These may optionally be filled in:  
#  
## List of custom serializations  
# topology.kryo.register:  
#     - org.mycompany.MyType  
#     - org.mycompany.MyType2: org.mycompany.MyType2Serializer  
#  
## List of custom kryo decorators  
# topology.kryo.decorators:  
#     - org.mycompany.MyDecorator  
#  
## Locations of the drpc servers  
# drpc.servers:  
#     - "server1"  
#     - "server2"  
 storm.local.dir: "/var/tmp/storm/workdir"  

注意:
Storm的配置文件格式有点让人郁闷。在每个配置项前面必须留有空格,否则会无法识别。
storm.messaging.* 部分是Netty的配置。如果没有该部分。那么Storm默认还是使用ZeroMQ。 (如上所说,Apache新版默认Netty,无须额外添加了)

b. 配置supervisor
修改storm的conf/storm.yaml文件如下:

[plain]
view plaincopyprint?





########### These MUST be filled in for a storm configuration  
 storm.zookeeper.servers:  
     - "10.1.110.21"  
     - "10.1.110.22"  
     - "10.1.110.24"  
   
 nimbus.host: "10.1.110.24"  
#   
#   
# ##### These may optionally be filled in:  
#      
## List of custom serializations  
# topology.kryo.register:  
#     - org.mycompany.MyType  
#     - org.mycompany.MyType2: org.mycompany.MyType2Serializer  
#  
## List of custom kryo decorators  
# topology.kryo.decorators:  
#     - org.mycompany.MyDecorator  
#  
## Locations of the drpc servers  
# drpc.servers:  
#     - "server1"  
#     - "server2"  
 supervisor.slots.ports:  
     - 6700  
     - 6701  
     - 6702  
 storm.local.dir: "/var/tmp/storm/workdir"  

注意:
i.  nimbus.host是nimbus的IP或hostname
ii. supervisor.slots.ports 是配置slot的ip地址。配了几个地址,就有几个slot,即几个worker。如果尝试提交的topology所声明的worker数超过当前可用的slot,该topology提交会失败。
iii. storm.messaging 部分是Netty的配置,就不再重复叙述了。

仍然要注意格式问题。
你可以在这里找到所有的配置项:https://github.com/nathanmarz/storm/blob/master/conf/defaults.yaml

启动集群

1. 启动nimbus
在nimbus机器的Storm的bin目录下执行

[plain]
view plaincopyprint?





./storm nimbus  

2. (Optional) 在nimbus机器上启动 Storm UI  (Storm提供的一个简单的查看cluster信息的网页)

[plain]
view plaincopyprint?





./storm ui  

3. 启动supervisor
在supervisor机器的Storm的bin目录下执行

[plain]
view plaincopyprint?





./storm supervisor  

4. 检查
打开Storm UI 页面。本例是起在10.1.110.24上,所以打开: http://10.1.110.24:8080  
默认是启在8080端口上,如果你想改成其他的,如8089,直接修改nimbus的storm.yaml文件,添加

[plain]
view plaincopyprint?





ui.port=8089  

注意:
apache-storm-0.9.2-incubating 的storm ui 对于中文GBK或GB2312编码方式打开有问题。具体参见下方问题列表。

部署程序

1. 从https://github.com/nathanmarz/storm-starter去clone或者下载一个例子包

2. 将包内的m2-pom.xml重命名为pom.xml,并修改twitter4j的版本(人在中国伤不起啊.......)

[html]
view plaincopyprint?





<dependency>  
    <groupId>org.twitter4j</groupId>  
    <artifactId>twitter4j-core</artifactId>  
    <!--<version>2.2.6-SNAPSHOT</version>-->  
    <version>[2.2,)</version>  
</dependency>  
<dependency>  
    <groupId>org.twitter4j</groupId>  
    <artifactId>twitter4j-stream</artifactId>  
    <!--<version>2.2.6-SNAPSHOT</version>-->  
    <version>[2.2,)</version>  
</dependency>  
      

用Maven编译

[plain]
view plaincopyprint?





mvn clean install -Dmaven.test.skip  

3. 将storm-starter/target目录下的storm-starter-0.0.1-SNAPSHOT-jar-with-dependencies.jar拷到nimbus服务器上去

4. 部署topology

[plain]
view plaincopyprint?





./storm jar storm-starter-0.0.1-SNAPSHOT-jar-with-dependencies.jar storm.starter.WordCountTopology test  

5. 查看结果
两种方式,
a. 查看StormUI 



b. storm的bin目录下运行

[plain]
view plaincopyprint?





./storm list  

[plain]
view plaincopyprint?





769  [main] INFO  backtype.storm.thrift - Connecting to Nimbus at localhost:6627  
Topology_name        Status     Num_tasks  Num_workers  Uptime_secs  
-------------------------------------------------------------------  
test                 ACTIVE     28         3            20          

6. 关闭topology
a. StormUI上面点选要关闭的topology,如test,然后在新页面的Topology actions中选kill
b. 运行./storm kill test

常见问题

Storm的log文件默认存放在其logs目录下,其中我们一般要关心的是
nimbus下的nimbus.log和ui.log
supervisor下的
superviosr.log - supervisor启动、启动topology task、关闭等信息
worker-xxxx.log - 该worker上运行的task的具体log

1. worker-xxxx.log 显示2013-09-02 15:31:53 worker [WARN] Received invalid messages for unknown tasks. Dropping... 
该问题是host配置问题,解析host出问题
解决办法:
a. 

[plain]
view plaincopyprint?





hostname <new-name>  

b. 

[plain]
view plaincopyprint?





vi /etc/sysconfig/network  

设置HOSTNAME=<new-name>

c. 

[plain]
view plaincopyprint?





vi /etc/hosts  

将ipv4地址解析成<new-name>,并添加其他节点信息,如:

[plain]
view plaincopyprint?





10.1.110.24 nimbus  
10.1.110.22 supervisor-22  
10.1.110.21 supervisor-21  

注意:
如果是ipv6,需要更改Storm的配置文件支持ipv6.默认是ipv4。

2. StormUI上面nimbus和supervisor都显示127.0.0.1
解决办法同1

3. 启动时,supervisor.log不停刷新 5fefa024-50b2-4c5c-b8e2-c2360501cb03 still hasn't started
出现几条是正常的,work 启动需要时间。但是如果一直刷新,就有问题。可以到supervisor.log中把它上面紧挨着的java 启动命令考下来,单独执行。看看是哪里有问题。

4. topologykill后,kill supervisor或nimbus,立刻启动,有时会自动shutdown
supervisor和nimbus启动、关闭后,zookeeper上信息会有同步。每次启动,会尝试恢复、停止上一次的task。对于supervisor,可以等到StormUI上面topology完全停止后,再重启,可避免该问题。

5. 如何remote debug?
在storm的conf/storm.yaml里面加入worker.childopts: "-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"。

注:

这个参数是给启动的worker用的,一个worker对应一个JVM进程。所以如果有两个worker在该节点上启动,必定有一个fail。因为端口冲突!

在shutdown一个topology时,该worker的进程并不会自动关闭,所以端口已然被占着。这个时候再启动时,有可能会分配一个新进程,这时又会去绑该端口,也会fail!

所以应尽量避免remote debug,最后在本地模式调试好后才上传至cluster。

在每次debug后,要kill掉该supervisor才能避免下次部署失败。

6. Storm UI里面topology summary是空的?但是topology确实在运行着。

apache-storm-0.9.2-incubating引入了新版的jquery.tablesorter.min.js,其中有部分代码如下

[javascript]
view plaincopyprint?





ts.addParser({  
        id: "currency",  
        is: function (s) {  
            return /^[£$€?.]/.test(s);  
        }, format: function (s) {  
            return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g), ""));  
        }, type: "numeric"  
    });  

中间return 的正则特殊符号在GBK和GB2312下会有问题。导致js无法执行。
代码原址:https://github.com/christianbach/tablesorter/blob/master/jquery.tablesorter.js?#L910
解决办法:
修改
apache-storm-0.9.2-incubating/public/下的

component.html, 
index.html,
topology.html
在<head></head>中添加一行

[html]
view plaincopyprint?





<meta charset="UTF-8">  

如此设定页面encoding为UTF-8就没事了。

PS:我已经提交了这个修复,应该会被merge。

7. 如何查找某个component的log?
stormUI上找到该topology,点击进去后找到目标component (spout或bolt 等), 点击进去,找到 Executor 栏,里面有Host和Port,其实就是执行该component的task的worker。每个port会对应logs目录下worker-<port>.log的一个log文件,直接去该host上找到该文件查看即可。
注:
Storm有个logviewer的功能,即在每个superviosr上启动 ./storm logviewer 后,就可以在stormUI里面点击那个port后直接查看静态的log。
如果打不开,检查supervisor上logs/logviewer.log,看是否有错。然后看打开的URL里面host名在本地是否能正确的解析为目标IP。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  storm