搭建 Storm 集群的主要步骤
1. 搭建一个 Zookeeper 集群
2. 在 Nimbus 和所有工作机器(Supervisor)上安装 Storm 依赖的软件
Python-2.7.2
JAVA 7
ZeroMQ -2.1.7
JZMQ
unzip
3. 配置 storm.yaml
4. 使用 Storm 脚本启动 Nimbus,Supervisor 及 UI
#布置 ZK 集群
wget http://mirror.esocc.com/apache/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz
cp zookeeper-3.4.5.tar.gz /usr/local/
cd /usr/local/
tar -zxvf zookeeper-3.4.5.tar.gz
ln -s /usr/local/zookeeper-3.4.5/ /usr/local/zookeeper
vim /etc/profile (设置 ZOOKEEPER_HOME 和 ZOOKEEPER_HOME/bin)
export ZOOKEEPER_HOME="/usr/local/zookeeper"
export PATH=$PATH:$ZOOKEEPER_HOME/bin
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg ( 用zoo_sample.cfg 制作$ZOOKEEPER_HOME/conf/zoo.cfg)
mkdir /tmp/zookeeper
mkdir /var/log/zookeeper
配置ZK集群:
(1)配置 Zookeeper 路径下的 conf/zoo.cfg
dataDir=/tmp/zookeeper (即之前创建的文件夹,可以自定)
dataLogDir=/var/log/zookeeper
clientPort=2181
server.1=10.15.144.71:2888:3888
server.2=10.15.144.72:2888:3888
server.3=10.15.144.73:2888:3888
(2)在对应 IP 的节点上的/tmp/zookeeper 目录中,创建 myid 文件,该文件中只包涵一个数字(对应 1/2/3)。
(3)进入 Zookeeper 的安装目录的 bin/目录,使用命令 zkServer.sh start 将 zookeeper 守护进程启动。
#安装 Storm 依赖的软件
1、安装 Python-2.6.6 或以上版本(系统默认自带的是2.4.3版本)
先安装GCC
yum -y install gcc
wget http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tar.bz2(最好安装2.7.2)
tar -jxvf Python-2.7.2.tar.bz2
cd Python-2.7.2
./configure
make
make install
make clean
make distclean
查看版本信息
$python -V
$Python 2.4.3
建立软连接,使系统默认的python指向python2.7.2
正常情况下即使python2.7.2安装成功后,系统默认指向的python仍然是2.4.3版本,考虑到yum是基于python2.4.3才能正常工作,不敢轻易卸载。如何实现将系统默认的python指向到2.7.2版本呢?
$mv /usr/bin/python /usr/bin/python2.4
$ln -s /usr/local/bin/python2.7 /usr/bin/python
检验python指向是否成功
$python -V
$Python 2.7.2
解决系统python软链接指向python2.7版本后,yum不能正常工作
$vi /usr/bin/yum
将文件头部的
#!/usr/bin/python
改成
#!/usr/bin/python2.4
2、安装 zeromq
zeromq的安装,先安装各种所需的依赖包:
$ yum install autoconf
$ yum install automake
$ yum install libtool
$ yum install gcc
$ yum install gcc-c++
$ yum install make
$ yum install libuuid-devel/uuid-dev
$ yum install git
Git的安装
yum install
However, when trying to install git this way, you'll encounter the following error on CentOS 5:
yum install git
Setting up Install Process
Parsing package install arguments
No package git available.
Nothing to do
First, download the rpmforge-release package:
wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
Next, verify and install the package:
rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
rpm -K rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
rpm -i rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
And now we should be able to install git:
yum install git
下载安装zeromq
wget http://download.zeromq.org/zeromq-2.1.7.tar.gz (最好安装zeromq-2.1.7.tar.gz)
tar -xzf zeromq-2.1.7.tar.gz
cd zeromq-2.1.7
./configure
make
make install
make clean
make distclean
这里要说一下在./configure中可能会遇到的问题:
首先我遇到了:configure:error:in '/usr/local/download/zeromq-2.1.7':
congifure:error:no acceptable C compiler found in $PATH
See 'config.log' for more details
这是因为没有安装C编译器。
解决方法是:# yum install gcc*
之后遇到的问题是:Error:cannot link with -luuid, install uuid-dev
这是因为没有安装uuid相关的package。
解决方法是:
$ yum install uuid*
$ yum install e2fsprogs*
$ yum install libuuid*
问题解决了以后就可以make和make install了,如此这般,zeromq就安装好了,接下来我们安装jzmq
3、安装 jzmq ( jzmq的安装貌似是依赖zeromq的,所以应该先装zeromq,再装jzmq)
git clone https://github.com/nathanmarz/jzmq.git (git: command not found)
cd jzmq
./autogen.sh
./configure
make
make install
make clean
make distclean
操作中出现的问题:
git clone https://github.com/nathanmarz/jzmq.git
Cloning into 'jzmq'...
error: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed while accessing https://github.com/nathanmarz/jzmq.git/info/refs?service=git-upload-pack
fatal: HTTP request failed
解决方法:
env GIT_SSL_NO_VERIFY=true git clone https://github.com/nathanmarz/jzmq.git
4、安装unzip
(1)如果使用RedHat系列Linux系统,执行以下命令安装unzip:
apt-get install unzip
(2)如果使用Debian系列Linux系统,执行以下命令安装unzip:
yum install unzip
#Storm 的安装
wget http://cloud.github.com/downloads/nathanmarz/storm/storm-0.8.1.zip
unzip storm-0.8.1.zip
mv storm-0.8.1 /usr/local/
配置环境变量
vim ~/.bashrc
export STORM_HOME=/usr/local/storm-0.8.1
export PATH=$PATH:$STORM_HOME/bin
自定义目录,配置文件中需要指明
mkdir /tmp/storm
配置 Storm.yaml文件:(在修改配置文件前有一点需要强调,在每一项的开始时要加空格,冒号后也必须要加空格)
vim storm.yaml
storm.zookeeper.server:
- "10.15.144.71"
- "10.15.144.72"
- "10.15.144.73"
storm.local.dir: "/tmp/storm"
nimbus.host: "10.15.107.213"
storm.zookeeper.port: 2181
storm.cluster.mode: "distributed"
ui.port: 9090
storm.zookeeper.servers: 配置storm集群使用的Zookeeper集群地址
Storm.local.dir: 配置storm信息存储目录
storm.zookeeper.port: 配置zookeeper使用的端口。注意,此下的端口需与zookeeper配置文件中的clientPort端口号保持一致
nimbus.host: 配置storm集群Nimbus机器地址,各个Supervisor工作节点需要知道哪个机器是Nimbus,以便下载 Topologies的jars、confs等文件
storm.ui: 配置Storm可视化工具的端口。此项可不配置,如果不配置,则默认为8080端口。为避免8080端口已被 占用的风险,故此处设置为9090
java.library.path: 配置storm 所依赖的本地依赖(ZeroMQ 和 JZMQ)的加载地址,默认的 是:/usr/local/lib:/opt/local/lib:/usr/lib,大多情况下是对的,所以你应该不用更改这个配置,除 非你系统的库路径给默认配置不一样。
supervisor.slots.ports: 配置工作机器的工作端口。supervisor.slots.ports 对于每一台工作机器,这个配置指定在这台工作 机器上运行多少工作进程,每个进程使用一个独立端口来接收消息,这个配置同时也指定使用哪些端 口。如果你在这里定义5个端口,storm 会在这个机器上最多分配5个工作进程。如果分配3个端口,那 么最多分配3个进程。设置配置4个 worker 运行在端口6700、6701、6702、6703。
例如:supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
此项可以不配置,如果不配置则默认为以上四个端口
Storm 的启动
Nimbus: 在 Storm 主控节点上,即 nimbus 机器上的storm的bin目录下,执行 storm nimbus & 启动Nimbus 后台程序, 并放到后台执行,
Supervisor: 在 Storm 各个工作节点上,即 supervisor 机器上的storm的bin目录下,执行 storm supervisor & 启动 Supervisor 后台程序,并放到后台执行,
UI: storm UI是一个可以查看storm运行状态的的一个网站,通过nohup storm ui &运行,访问地址: http://{nimbus.host}:8080/
#向集群提供拓扑运行
http://hantec.iteye.com/blog/1783754
http://www.cnblogs.com/zeutrap/archive/2012/10/11/2720528.html
http://javanlu.github.io/blog/2013/10/11/storm-deploy-tutorial/
#终止一个topology:
storm kill {stormname}
其中{stormname}是提交topology给storm集群的时候指定的名字。storm不会马上终止topology。相反,它会先终止所有的spout,让它们不再发射任何新的tuple, storm会等Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS秒之后才杀掉所有的工作进程。这会给topology足够的时间来完成所有我们执行storm kill命令的时候还没完成的tuple。
storm jar /root/storm-starter-0.0.1-SNAPSHOT-jar-with-dependencies.jar storm.starter.WordCountTopology wordcount
Exception in thread "main" java.lang.RuntimeException: org.apache.thrift7.transport.TTransportException: java.net.ConnectException: Connection refused
at backtype.storm.utils.NimbusClient.(NimbusClient.java:36)
at backtype.storm.utils.NimbusClient.getConfiguredClient(NimbusClient.java:17)
at backtype.storm.StormSubmitter.submitTopology(StormSubmitter.java:53)
at storm.starter.WordCountTopology.main(WordCountTopology.java:77)
Caused by: org.apache.thrift7.transport.TTransportException: java.net.ConnectException: Connection refused
at org.apache.thrift7.transport.TSocket.open(TSocket.java:183)
at org.apache.thrift7.transport.TFramedTransport.open(TFramedTransport.java:81)
at backtype.storm.utils.NimbusClient.(NimbusClient.java:34)
... 3 more
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at org.apache.thrift7.transport.TSocket.open(TSocket.java:178)
... 5 more
解决方法如下:
[root@localhost opt]# vim /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=storm213
GATEWAY=10.15.107.254
[root@localhost opt]# vim /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost
::1 localhost6.localdomain6 localhost6
10.15.107.213 storm213
其它参考资料