Storm正式是一个分布式的、容错的实时计算系统,它被托管在GitHub上,遵循 Eclipse Public License 1.0。Storm是由BackType开发的实时处理系统,BackType现在已在Twitter麾下。GitHub上的最新版本是Storm 0.8.1,基本是用Clojure写的。
Storm为分布式实时计算提供了一组通用原语,可被用于“流处理”之中,实时处理消息并更新数据库。这是管理队列及工作者集群的另一种方式。 Storm也可被用于“连续计算”(continuous computation),对数据流做连续查询,在计算时就将结果以流的形式输出给用户。它还可被用于“分布式RPC”,以并行的方式运行昂贵的运算。 Storm的主工程师Nathan Marz表示:
Storm可以方便地在一个计算机集群中编写与扩展复杂的实时计算,Storm之于实时处理,就好比 Hadoop之于批处理。Storm保证每个消息都会得到处理,而且它很快——在一个小集群中,每秒可以处理数以百万计的消息。更棒的是你可以使用任意编程语言来做开发。
本次安装storm的操作系统是Ubuntu linux,但是其它系统应该也是大同小异
环境安装
以下几个软件是Storm安装或运行所必须的,如果已经安装了,可以跳过这个步骤
1.JAVA1.6以上版本安装
1'下载,在http://www.oracle.com/technetwork/indexes/downloads里下载需要的linux的java版本
2'安装(假设下载的文件为java1.6.0_37.bin,放在/home/administrator目录下)
将下载的安装文件授权为可以执行,使用chmod u+x java1.6.0_37.bin
改变工作目录到你要安装java的地方,我的是/usr/lib,所以是cd /usr/lib
运行安装文件 直接在shell中输入/home/administrator/java1.6.0_37.bin即可
3'环境设置,打开/etc/profile文件,在文件最后增加如下几行
export JAVA_HOME=/usr/lib/jdk1.6.0_37
export JRE_HOME=/usr/lib/jdk1.6.0_37/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
4'重启机器,在shell中键入java -version得到java version "1.6.0_37"的话表示安装好java环境了
2.Python安装
sudo apt-get install python
3.安装unzip
sudo apt-get install unzip
4.C++编译器安装
sudo apt-get install g++
5.uuid安装
sudo apt-get install uuid-dev
6.autocof安装
sudo apt-get install autoconf
7.automake安装
sudo apt-get install automake
8.ZooKeeper安装
ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。ZooKeeper本身可以以Standalone模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。
1'ZooKeeper Standalone模式
从Apache网站上(zookeeper.apache.org)下载ZooKeeper软件包,我选择了3.4.5版本的,在ubuntu下安装很简单,只需要解压缩后,简单配置一下即可以启动ZooKeeper服务器进程。
将zookeeper-3.4.5/conf目录下面的 zoo_sample.cfg修改为zoo.cfg,配置文件内容如下所示:
tickTime=2000
dataDir=/home/hadoop/storage/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
下面启动ZooKeeper服务器进程:
cd zookeeper-3.4.5/
bin/zkServer.sh start
通过jps命令可以查看ZooKeeper服务器进程,名称为QuorumPeerMain。
在客户端连接ZooKeeper服务器,执行如下命令:
bin/zkCli.sh -server ubuntu:2181
上面ubuntu是改为你自己的主机名,如果在本机执行,则执行如下命令即可:
bin/zkCli.sh
接着,可以使用help查看Zookeeper客户端可以使用的基本操作命令。
2'ZooKeeper Distributed模式
ZooKeeper分布式模式安装(ZooKeeper集群)也比较容易,这里说明一下基本要点。
首先要明确的是,ZooKeeper集群是一个独立的分布式协调服务集群,“独立”的含义就是说,如果想使用ZooKeeper实现分布式应用的协调与管理,简化协调与管理,任何分布式应用都可以使用,这就要归功于Zookeeper的数据模型(Data Model)和层次命名空间(Hierarchical Namespace)结构,在设计你的分布式应用协调服务时,首要的就是考虑如何组织层次命名空间。
下面说明分布式模式的安装配置,过程如下所示:
第一步:主机名称到IP地址映射配置
ZooKeeper集群中具有两个关键的角色:Leader和Follower。集群中所有的结点作为一个整体对分布式应用提供服务,集群中每个结点之间都互相连接,所以,在配置的ZooKeeper集群的时候,每一个结点的host到IP地址的映射都要配置上集群中其它结点的映射信息。
例如,我的ZooKeeper集群中每个结点的配置,以slave-01为例,/etc/hosts内容如下所示:
192.168.0.2 slave-01
192.168.0.3 slave-02
192.168.0.4 slave-03
ZooKeeper采用一种称为Leader election的选举算法。在整个集群运行过程中,只有一个Leader,其他的都是Follower,如果ZooKeeper集群在运行过程中Leader出了问题,系统会采用该算法重新选出一个Leader。因此,各个结点之间要能够保证互相连接,必须配置上述映射。
ZooKeeper集群启动的时候,会首先选出一个Leader,在Leader election过程中,某一个满足选举算的结点就能成为Leader。
第二步:修改ZooKeeper配置文件
在其中一台机器(slave-01)上,解压缩zookeeper-3.4.5.tar.gz,修改配置文件conf/zoo.cfg,内容如下所示:
tickTime=2000
dataDir=/home/hadoop/storage/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=slave-01:2888:3888
server.2=slave-02:2888:3888
server.3=slave-03:2888:3888
第三步:远程复制分发安装文件
上面已经在一台机器slave-01上配置完成ZooKeeper,现在可以将该配置好的安装文件远程拷贝到集群中的各个结点对应的目录下:
[plain] view plaincopy
cd /home/hadoop/installation/
scp -r zookeeper-3.4.5/ hadoop@slave-02:/home/hadoop/installation/
scp -r zookeeper-3.4.5/ hadoop@slave-03:/home/hadoop/installation/
第四步:设置myid
在我们配置的dataDir指定的目录下面,创建一个myid文件,里面内容为一个数字,用来标识当前主机,conf/zoo.cfg文件中配置的server.X中X为什么数字,则myid文件中就输入这个数字,例如:
hadoop@slave-01:~/installation/zookeeper-3.4.5$ echo "1" > /home/hadoop/storage/zookeeper/myid
hadoop@slave-02:~/installation/zookeeper-3.4.5$ echo "2" > /home/hadoop/storage/zookeeper/myid
hadoop@slave-03:~/installation/zookeeper-3.4.5$ echo "3" > /home/hadoop/storage/zookeeper/myid
按照上述进行配置即可。
第五步:启动ZooKeeper集群
在ZooKeeper集群的每个结点上,执行启动ZooKeeper服务的脚本,如下所示:
hadoop@slave-01:~/installation/zookeeper-3.4.5$ bin/zkServer.sh start
hadoop@slave-02:~/installation/zookeeper-3.4.5$ bin/zkServer.sh start
hadoop@slave-03:~/installation/zookeeper-3.4.5$ bin/zkServer.sh start
以结点slave-01为例,日志如下所示:
我启动的顺序是slave-01>slave-02>slave-03,由于ZooKeeper集群启动的时候,每个结点都试图去连接集群中的其它结点,先启动的肯定连不上后面还没启动的,所以上面日志前面部分的异常是可以忽略的。通过后面部分可以看到,集群在选出一个Leader后,最后稳定了。
其他结点可能也出现类似问题,属于正常。
第六步:安装验证
可以通过ZooKeeper的脚本来查看启动状态,包括集群中各个结点的角色(或是Leader,或是Follower),如下所示,是在ZooKeeper集群中的每个结点上查询的结果:
hadoop@slave-01:~/installation/zookeeper-3.4.5$ bin/zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/installation/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower
hadoop@slave-02:~/installation/zookeeper-3.4.5$ bin/zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/installation/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: leader
hadoop@slave-03:~/installation/zookeeper-3.4.5$ bin/zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/installation/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower
通过上面状态查询结果可见,slave-02是集群的Leader,其余的两个结点是Follower。
9.ZeroMQ 2.2.0安装(ZeroMQ是Storm内部消息系统)
ZeroMQ是网络栈中新的一层,它是个可伸缩层,分散在分布式系统间。因此,它可支持任意大的应用程序。ZeroMQ不是简单的点对点交互,相反,它定义了分布式系统的全局拓扑。ZeroMQ应用程序没有锁,可并行运行。此外,它可在多个线程、内核和主机盒之间弹性伸缩。
wget http://download.zeromq.org/zeromq-2.1.7.tar.gz
tar -xzf zeromq-2.1.7.tar.gz
cd zeromq-2.1.7
./configure
make
sudo make install
10.jzmq安装(JZMQ是ZeroMQ的Java Binding)
git clone https://github.com/nathanmarz/jzmq.git
cd jzmq
./autogen.sh
./configure
make
sudo make install
两个安装时的错误修正方法
1.make[1]: *** 没有规则可以创建“org/zeromq/ZMQ.class”需要的目标“classdist_noinst.stamp”。 停止
修正方法,创建classdist_noinst.stamp文件,
touch src/classdist_noinst.stamp
2.错误:无法访问 org.zeromq.ZMQ
修正方法,手动编译相关java代码
javac -d . org/zeromq/*.java
11.Storm安装
在Nimbus和Supervisor机器上分别安装Storm发行版本,ubuntu下的安装其实非常简单,下载后解压好后只需配置好就算安装好了
首先 、下载Storm发行版本,推荐使用Storm0.8.1:
wget https://github.com/downloads/nathanmarz/storm/storm-0.8.1.zip
然后解压到安装目录下:
unzip storm-0.8.1.zip
接着修改Storm的配置文件
Storm的解压目录下有一个conf/storm.yaml文件,用于配置Storm。默认配置在这里可以查看。conf/storm.yaml中的配置选项将覆盖defaults.yaml中的默认配置。以下配置选项是必须在conf/storm.yaml中进行配置的:
1) storm.zookeeper.servers: Storm集群使用的Zookeeper集群地址,将下面的地址改成你自己的地址:
storm.zookeeper.servers:
- "192.168.0.2"
- "192.168.0.3"
如果Zookeeper集群使用的不是默认端口,那么还需要storm.zookeeper.port选项。
2) storm.local.dir: Nimbus和Supervisor进程用于存储少量状态,如jars、confs等的本地磁盘目录,需要提前创建该目录并给以足够的访问权限。然后在storm.yaml中配置该目录,如:
storm.local.dir: "/home/hduser/storm/workdir"
3) java.library.path: Storm使用的本地库(ZMQ和JZMQ)加载路径,默认为"/usr/local/lib:/opt/local/lib:/usr/lib",一般来说ZMQ和JZMQ默认安装在/usr/local/lib 下,因此不需要配置即可。
4) nimbus.host: Storm集群Nimbus机器地址,各个Supervisor工作节点需要知道哪个机器是Nimbus,以便下载Topologies的jars、confs等文件,如:
nimbus.host: "192.168.0.2"
5) supervisor.slots.ports: 对于每个Supervisor工作节点,需要配置该工作节点可以运行的worker数量。每个worker占用一个单独的端口用于接收消息,该配置选项即用于定义哪些端口是可被worker使用的。默认情况下,每个节点上可运行4个workers,分别在6700、6701、6702和6703端口,如:
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
至此Storm的安装完成,可以使用Storm了
启动Storm各个后台进程
启动Storm的所有后台进程。和Zookeeper一样,Storm也是快速失败(fail-fast)的系统,这样Storm才能在任意时刻被停止,并且当进程重启后被正确地恢复执行。这也是为什么Storm不在进程内保存状态的原因,即使Nimbus或Supervisors被重启,运行中的Topologies不会受到影响。
以下是启动Storm各个后台进程的方式:
Nimbus: 在Storm主控节点上运行"bin/storm nimbus >/dev/null 2>&1 &"启动Nimbus后台程序,并放到后台执行;
Supervisor: 在Storm各个工作节点上运行"bin/storm supervisor >/dev/null 2>&1 &"启动Supervisor后台程序,并放到后台执行;
UI: 在Storm主控节点上运行"bin/storm ui >/dev/null 2>&1 &"启动UI后台程序,并放到后台执行,启动后可以通过http://{nimbus host}:8080观察集群的worker资源使用情况、Topologies的运行状态等信息。
注意事项:
Storm后台进程被启动后,将在Storm安装部署目录下的logs/子目录下生成各个进程的日志文件。
经测试,Storm UI必须和Storm Nimbus部署在同一台机器上,否则UI无法正常工作,因为UI进程会检查本机是否存在Nimbus链接。
为了方便使用,可以将bin/storm加入到系统环境变量中。
至此,Storm集群已经部署、配置完毕,可以向集群提交拓扑运行了。
storm jar 命令提交Topology给集群
storm kill 命令杀死某个Topology