Storm集群部署
部署环境
虚拟机4台,CPU:4核,内存:6G,硬盘:50G。
1台用于nimbus及web ui:192.168.0.64
3台用于supervisor:192.168.0.41,192.168.0.42,192.168.0.65
系统均为Centos 6.3
软件版本
SUN JDK 1.6
Python 2.6.6
Zookeeper 3.4.5 ,这里我使用了3个节点的集群分别为:zookeeper-1,zookeeper-2,zookeeper-3
Storm 0.8.2
安装过程
- 修改各自的hostname,例如
<pre code_snippet_id="319147" snippet_file_name="blog_20140429_1_8531222" name="code" class="plain" style="color: rgb(51, 51, 51); font-size: 14px; line-height: 20px;">#修改HOSTNAME vim /etc/sysconfig/networkHOSTNAME=supervisor-4#同时修改hostname让其立即生效hostname supervisor-4
- 配置各个服务器的/etc/hosts 类似下面。注意127.0.0.1在对应各自的域名
127.0.0.1 nimbus
192.168.0.64 nimbus
192.168.0.65 supervisor-1
192.168.0.41 supervisor-2
192.168.0.42 supervisor-3
- 安装zeromq
wget http://download.zeromq.org/zeromq-2.1.7.tar.gz
tar zxvf zeromq-2.1.7.tar.gz
cd zeromq-2.1.7
./configure
make
make install
在configure过程中出现如下错误
checking for uuid_generate in -luuid… no
configure: error: cannot link with -luuid, install uuid-dev. 安装缺少的依赖
yum install uuid* e2fsprogs* libuuid* -y
- 安装jzmq
git clone git://github.com/nathanmarz/jzmq.git
cd jzmq
./autogen.sh
./configure
make
make install 在configure过程中出现如下错误
configure: error: the JAVA_HOME environment variable must be set to your JDK location. 解决办法是设置JAVA_HOME环境变量
- 安装storm
wget https://github.com/nathanmarz/storm/archive/0.8.2.zip
unzip storm-0.8.2.zip
- 配置storm
在配置时一定注意在每一项的开始时要加空格,冒号后也必须要加空格,否则storm就不认识这个配置文件了。
修改conf/storm.yaml文件:
storm.local.dir: "/var/storm"
storm.zookeeper.servers:
- "zookeeper-1"
- "zookeeper-2"
- "zookeeper-3"
nimbus.host: "nimbus"
#最大worker数量及对应端口,这个需要根据实际业务特点配置
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
#避免中文乱码
worker.childopts: "-Xmx768m -Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8"
- 安装daemontools
因为Storm的各个组件都是快速失败,需要使用daemontools来保证服务的可靠性
sudo wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
sudo tar zxvf daemontools-0.76.tar.gz
#当前版本需要打补丁,google就会找到
sudo wget http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/daemontools-0.76.errno.patch
cd admin/daemontools-0.76/
sudo patch -p1 < ../../daemontools-0.76.errno.patch
sudo ./package/install
#输出最后如下:
Creating /service…
Adding svscanboot to inittab…
init should start svscan now.
#安装完成
- 配置daemontools
在nimbus节点配置nimbus的daemontools
mkdir /service/storm
touch /service/storm/run
chmod 755 /service/storm/run
vi /service/storm/run 在该文件中输入如下内容
#!/bin/sh
exec 2>&1
exec /opt/storm-0.8.2/bin/storm nimbus 在nimbus节点配置ui的daemontools
mkdir /service/stormui
touch /service/stormui/run
chmod 755 /service/stormui/run
vi /service/stormui/run 在该文件中输入如下内容
#!/bin/sh
exec 2>&1
exec /opt/storm-0.8.2/bin/storm ui 在每个supervisor节点配置daemontools
mkdir /service/storm
touch /service/storm/run
chmod 755 /service/storm/run
vi /service/storm/run 在文件中输入如下内容
#!/bin/sh
exec 2>&1
exec /opt/storm-0.8.2/bin/storm supervisor
- 使用daemontools
启动nimbus或supervisor
nohup supervise /service/storm/ & 启动ui
nohup supervise /service/storm/ & 通过ps命令可以看到对应的进程已经启动
[root@nimbus ~]# ps -ef|grep storm
root 1018 1013 0 2013 ? 00:00:01 supervise stormui
root 1019 1013 0 2013 ? 00:00:02 supervise storm 在kill -9后进程会被自动重启
停止daemontools命令
#停止daemontools的supervise命令
svc -d /service/storm/
#停止后的重新启动
svc -u /service/storm/
- 设置开机启动daemontools
touch /etc/init/svscan.conf
vi /etc/init/svscan.conf
#添加如下内容
start on runlevel [345]
respawn
exec /command/svscanboot
#编辑完成,保存文件
initctl reload-configuration
initctl start svscan 通过ps命令可以看到svscanboot运行成功
[root@nimbus ~]# ps -ef|grep svscan
root 1003 1 0 2013 ? 00:00:00 /bin/sh /command/svscanboot
root 1013 1003 0 2013 ? 00:06:19 svscan /service
另一种可能的办法(在笔者的环境中没有配置成功,供其他人参考)
将以下内容放入到/etc/rc.local最后
csh -cf '/command/svscanboot &'
- 关于Storm web ui
当启动Storm的web ui之后,并且端口没有更改时,可以通过如下地址访问
http://{NIMBUS_HOST}:8080 ui上会显示当前集群状态,运行的Topology的状态等重要信息
- 组件配置更改
当修改了ui、nimbus、supervisor的配置时,可以直接kill掉响应的组件,由daemontools为你自动重启,如果为了放心,可以在ui上先停掉所有的topology
- 日志的配置
当前的storm版本使用log4j配置日志,配置文件在log4j/storm.log.properties。我当前的配置为
log4j.rootLogger=INFO, A2
log4j.appender.A1 = org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File = ${storm.home}/logs/${logfile.name}
log4j.appender.A1.Append = true
log4j.appender.A1.DatePattern = '.'yyy-MM-dd
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} %c{1} [%p] %m%n
log4j.appender.A2 = org.apache.log4j.RollingFileAppender
log4j.appender.A2.Threshold = DEBUG
log4j.appender.A2.File = /letv/storm-logs/${logfile.name}
log4j.appender.A2.Append = true
log4j.appender.A2.MaxFileSize = 500MB
log4j.appender.A2.MaxBackupIndex = 3
log4j.appender.A2.layout = org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} %c{1} [%p] %m%n
- 测试Storm集群
下载storm-starter并编译打包,期间因“某种原因”访问不到的依赖就需要“特殊技巧”下载下来并放到maven私服中。
在nimbus节点提交测试用topology
bin/storm jar storm-starter-0.0.1-SNAPSHOT.jar storm.starter.WordCountTopology wordcount 注意wordcount是topology名字,这个参数会使其运行在集群是,否则是本地模式
|