Storm集群,利用了分布式系统中经典的master/slave架构。以下显示的是一个Storm集群,其中master节点为Nimbus,slave节点有四个,称之为supervisor。
在传统的master/slave架构中,都是master节点负责任务的接受、分配、监控等管理任务,从节点负责任务的执行。
总的来说,storm中的主从架构,基本上也符合这个规则。(以下纯属个人理解)不过storm对这个master/slave架构有着一定的扩展:
主节点Nimbus依然是负责在集群分发任务(Topology)的代码以及监控等。
从节点Supervisor的任务有点改变,其并不是自己直接执行任务。在接受到一个任务的时候,Supervisor会启动一个或多个进程(称之为Worker),来处理任务。所以实际上,任务最终都是分配到了worker上。
默认情况下,一个supervisor最多可以启动4个进程,也就是启动四个worker,当然我们也可以进行修改。这样设计的目的实际上是为了充分利用现代多核CPU的特性,storm是计算密集型的框架,一台机器只启动一个进程太浪费了,因此supervisor同时启动多个进程(worker)来进行处理任务。事实上,你可以这样理解,nimbus分配任务时,它是不关心有几个supervisor的,其关心的是有多少个worker,因为任务(Topology)最终都是通过worker来执行的。假设我们向Storm集群中提交一个Topology,指定由四个worker来执行。那么nimbus最终就会分配四个worker来执行这个任务,至于这个4个worker是分配在一个还是多个supervisor节点上,nimbus是不关心的。
让我们用一个案例来进行更加详细的说明:
假设我们现在有一个Storm集群,一台nimbus和4台supervisor,默认情况下,一个supervisor可以启动4个worker。因此如下图所示,我们的集群中现在有16个worker。现在我们向这个集群中提交一个Topology,指定要有4个worker来执行。图中星号标记的就是使用到的worker。
从图中,我们可以看到这四个worker分配在supervisor1(1个worker)、supervisor2(2个worker)和supervisor3(1个worker)上。可以看到,并不是一个supervisor分配一个worker。这是因为nimbus是对Topology的任务分配,是针对worker来的,我们指定了Topology要四个worker,然后我们总共有16个worker,storm只要从这个16个worker中选择四个worker就行了,并不会平均分配。这就有可能导致,选择出来的worker中,可能有些是位于同一个supervisor中的,例如案例中就有2个worker位于supervisor2上,而另外一些supervisor可能不需要执行任务,例如supervisor4。
要注意的是:一个worker同时只能运行一个Topology。如果此时我们想提交另外一个Topology,不管指定使用几个worker来执行,都只能在剩余的12个worker中来选择了!
storm集群搭建
要搭建storm集群,需要准备一下软件。
1、JDK1.7
2、Zookeeper3.4.5
3、Storm0.9.2 incubating
本文准备了两台机器,来搭建zookeeper。主机名分别是
static.tianshouzhi.com
www.huhuamin.com
一、JDK安装
略…
二、Zookeeper的安装
在实际情况下,我们的zookeeper都会以集群的方式进行安装,由于在本文中,我们主要学习的是Storm,没有必要花过多的时间在zookeeper上,因此这里,我只在static.tianshouzhi.com这台机器上安装一份Zookeeper。以免喧宾夺主。
1、下载解压、安装:
cd /usr/local
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz
tar -xvzf zookeeper-3.4.5.tar.gz
在/etc/profile 里配置:
ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.5
PATH=$PATH:$ZOOKEEPER_HOME/bin
最后:
source /etc/profile
2、启动和停止
启动
zkServer.sh start
停止
zkServer.sh stop
三、Storm集群安装:
在static.tianshouzhi.com和www.huhuamin.com两台机器中,每一台都进行一下步骤
下载解压
wget https://github.com/apache/storm/archive/v0.9.2-incubating.zip
unzip v0.9.2-incubating.zip -d /usr/local/
修改配置文件conf/storm.yaml,这会覆盖 defaults.yaml中的重复内容。要注意的是,defaults.yaml在conf目录下并不存在,而是打包在lib/storm-core-XXX.jar中。
默认配置项的内容通过以下链接可以看到:
https://github.com/apache/storm/blob/master/conf/defaults.yaml
修改配置项
- storm.zookeeper.servers: 因为Storm所有的信息都是存储在Zookeeper中的,所以要指定Zookeeper服务器的地址
storm.zookeeper.servers:
- "static.tianshouzhi.com"
- storm.local.dir:
Nimbus和 Supervisor守护进程需要一个目录来存储一些状态信息,例如( jars, confs, and things like that )
storm.local.dir: "/data/storm"
- nimbus.host:
worker需要知道那一台机器是master,从而可以下载 topology jars 和confs
nimbus.host: “static.tianshouzhi.com”
- supervisor.slots.ports
对于每一个supervisor机器,我们可以通过这项来配置运行多少worker在这台机器上。每一个worker使用一个单独的port来接受消息,这个端口同样定义了那些端口是开放使用的。如果你在这里定义了5个端口,就意味着这个supervisor节点上最多可以运行5个worker。如果定义3个端口,则意味着最多可以运行3个worker。在默认情况下(即配置在defaults.yaml中),会有有四个workers运行在 6700, 6701, 6702, and 6703端口。例如:
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
要注意的是:supervisor并不会在启动时就立即启动这四个worker。而是接受到分配的任务时,才会启动,具体启动几个worker也要根据我们Topology在这个supervisor需要几个worker来确定。如果指定Topology只会由一个worker执行,那么supervisor就启动一个worker,并不会启动所有。
四、集群运行
启动storm集群
主节点:执行以下命令
nohup $STORM_HOME/bin/storm nimbus &
#从节点,执行一下命令
nohup $STORM_HOME/bin/storm supervisor &
转自:Storm集群架构及搭建