本节书摘来自华章计算机《Storm企业级应用:实战、运维和调优》一书中的第2章,第2.3节,作者:马延辉 陈书美 雷葆华著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.3 安装部署Storm集群
Storm的安装、部署过程分为安装依赖、安装Storm、启动和查看安装等几个部分。其中,前两部分内容在三个节点上都是一样的,只要在启动时区分开角色即可。接下来将讲解Storm集群的安装过程。
2.3.1 安装Storm依赖库
在Nimbus和Supervisor的节点上安装Storm时,都需要安装相关的依赖库,具体如下:
ZeroMQ 2.1.7。
JZMQ。
其中,ZeroMQ推荐使用2.1.7版本,请勿使用2.1.10版本。官方解释是因为该版本的一些严重Bug会导致Storm集群运行时出现奇怪的问题。另外,以上依赖库的版本经过Storm官方测试,但不能保证在其他版本的Java或Python库下可运行。
1.?安装ZeroMQ
Storm底层队列的实现使用ZeroMQ,为了实现低耦合,Storm并没有将ZeroMQ放置到其工程中,所以需要预先安装。先下载源码,然后编译安装ZeroMQ,命令如下:
wget http:// download.zeromq.org/zeromq-2.1.7.tar.gz
tar -vxzf zeromq-2.1.7.tar.gz
cd zeromq-2.1.7
./conf?igure
make
make install
1)其中./conf?igure时会检查JAVA_HOME是否正确,不正确会报错,并提示。
2)如果安装过程报错uuid找不到,则通过如下的命令安装uuid库:
yum install gcc gcc-c++
yum install uuidd
如遇到报错“Error:cannot link with -luuid, install uuid-dev”,则安装部分依赖包:
yum install e2fsprogs e2fsprogs-devel
当然,以上的依赖工具安装命令使用的是yum,不同的Linux分支使用不同的安装命令,例如Ubuntu使用apt-get。用户根据自己选用的操作系统来选用不用的命令,可能有些依赖工具在不同的Linux系统上对应的名称不太一致,但是总能找到对应的依赖包。
2.?安装JZMQ
JZMQ是ZeroMQ的Java语言的绑定实现,因为安装过程中使用unzip命令,首先要使用yum等的安装工具安装unzip工具。然后根据下面的代码一步一步下载、配置、编译和安装JZMQ。
#安装依赖工具包
yum install pkgconf?ig libtool
#下载、配置、编译和安装
wget https:// github.com/nathanmarz/jzmq/archive/master.zip -O jzmq.zip
unzip jzmq.zip
cd jzmq-master
./autogen.sh
./conf?igure
make
make install
2.3.2 安装Storm集群
下面介绍Storm 0.8.2的详细安装过程。
1.?下载并解压Storm 0.8.2
在Nimbus和Supervisor节点上安装Storm发行版本。Nimbus安装在test1节点上,Supervisor安装在test2和test3节点上。这些节点的配置文件完全相同。直接在http://storm-project.net/downloads.html
页面下载0.8.2版本,如图2-1所示。
也可以在客户端节点下载后复制到集群节点,或在客户端复制链接地址后在集群节点使用wget命令下载。在完成下载或复制后,将压缩包解压,命令如下:
mv storm-0.8.2.zip /opt/modules/
unzip storm-0.8.2.zip
2.?修改storm.yaml配置文件
Storm发行版本解压目录下有一个conf/storm.yaml文件,用于配置Storm。可以在这里查看默认配置。conf/storm.yaml中的配置选项将覆盖defaults.yaml中的默认配置。以下最基本的配置选项必须在conf/storm.yaml中配置。
1)storm.zookeeper.servers: Storm集群使用的ZooKeeper集群地址,格式如下:
storm.zookeeper.servers:
- "test1"
- "test2"
- "test3"
如果ZooKeeper集群使用的不是默认端口,那么还需要storm.zookeeper.port选项。
2)storm.local.dir: Nimbus和Supervisor进程用于存储少量状态,如JAR、配置文件等的本地磁盘目录,需要提前创建该目录并给以足够的访问权限,然后在storm.yaml中配置该目录,代码如下:
storm.local.dir: "/var/storm"
3)nimbus.host: Storm集群Nimbus机器地址,各个Supervisor工作节点需要知道哪个节点是Nimbus,以便下载Topology的JAR、配置等文件,代码如下:
nimbus.host: "test1"
当然这几项配置都是最基本的配置选项,其他的配置选项都在defaults.yaml文件中,该文件的详细内容如下,供读者参考使用。
########### These all have default values as shown
########### Additional conf?iguration goes into Storm.yaml
java.library.path: "/usr/local/lib:/opt/local/lib:/usr/lib"
### storm.* conf?igs are general conf?igurations
# the local dir is where jars are kept
storm.local.dir: "storm-local"
storm.zookeeper.servers:
- "localhost"
storm.zookeeper.port: 2181
storm.zookeeper.root: "/storm"
storm.zookeeper.session.timeout: 20000
storm.zookeeper.connection.timeout: 15000
storm.zookeeper.retry.times: 5
storm.zookeeper.retry.interval: 1000
storm.cluster.mode: "distributed" # can be distributed or local
storm.local.mode.zmq: false
### nimbus.* conf?igs are for the master
nimbus.host: "localhost"
nimbus.thrift.port: 6627
nimbus.childopts: "-Xmx1024m"
nimbus.task.timeout.secs: 30
nimbus.supervisor.timeout.secs: 60
nimbus.monitor.freq.secs: 10
nimbus.cleanup.inbox.freq.secs: 600
nimbus.inbox.jar.expiration.secs: 3600
nimbus.task.launch.secs: 120
nimbus.reassign: true
nimbus.f?ile.copy.expiration.secs: 600
### ui.* conf?igs are for the master
ui.port: 8080
ui.childopts: "-Xmx768m"
drpc.port: 3772
drpc.invocations.port: 3773
drpc.request.timeout.secs: 600
transactional.zookeeper.root: "/transactional"
transactional.zookeeper.servers: null
transactional.zookeeper.port: null
### supervisor.* conf?igs are for node supervisors
# Def?ine the amount of workers that can be run on this machine. Each worker is assigned
a port to use for communication
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
supervisor.childopts: "-Xmx1024m"
#how long supervisor will wait to ensure that a worker process is started
supervisor.worker.start.timeout.secs: 120
#how long between heartbeats until supervisor considers that worker dead and tries
to restart it
supervisor.worker.timeout.secs: 30
#how frequently the supervisor checks on the status of the processes it's monitoring
and restarts if necessary
supervisor.monitor.frequency.secs: 3
#how frequently the supervisor heartbeats to the cluster state (for nimbus)
supervisor.heartbeat.frequency.secs: 5
supervisor.enable: true
### worker.* conf?igs are for task workers
worker.childopts: "-Xmx768m"
worker.heartbeat.frequency.secs: 1
task.heartbeat.frequency.secs: 3
task.refresh.poll.secs: 10
zmq.threads: 1
zmq.linger.millis: 5000
### topology.* conf?igs are for specif?ic executing storms
topology.enable.message.timeouts: true
topology.debug: false
topology.optimize: true
topology.workers: 1
topology.acker.executors: 1
topology.acker.tasks: null
topology.tasks: null
# maximum amount of time a message has to complete before it's considered failed
topology.message.timeout.secs: 30
topology.skip.missing.kryo.registrations: false
topology.max.task.parallelism: null
topology.max.spout.pending: null
topology.state.synchronization.timeout.secs: 60
topology.stats.sample.rate: 0.05
topology.fall.back.on.java.serialization: true
topology.worker.childopts: null
topology.executor.receive.buffer.size: 1024 #batched
topology.executor.send.buffer.size: 1024 #individual messages
topology.receiver.buffer.size: 8 # setting it too high causes a lot of problems
(heartbeat thread gets starved, throughput plummets)
topology.transfer.buffer.size: 1024 # batched
topology.tick.tuple.freq.secs: null
topology.worker.shared.thread.pool.size: 4
topology.disruptor.wait.strategy: "com.lmax.disruptor.BlockingWaitStrategy"
topology.spout.wait.strategy: "backtype.storm.spout.SleepSpoutWaitStrategy"
topology.sleep.spout.wait.strategy.time.ms: 1
dev.zookeeper.path: "/tmp/dev-storm-zookeeper"
2.3.3 启动Storm集群
最后一步,启动Storm的所有后台进程。和ZooKeeper一样,Storm也是快速失败(fail-fast)的系统,能在任意时刻被停止,并且当进程重启后能够正确恢复执行。这也是为什么Storm不在进程内保存状态的原因,即使重启Nimbus或Supervisor进程,运行中的Topology不会受到影响。
首先,还是因为需要使用hadoop用户启动进程,需要更改文件权限,命令如下:
mkdir /var/storm
chown -R hadoop:hadoop /var/storm
chown -R hadoop:hadoop /opt/modules/*storm*
下面介绍启动Storm各个后台进程的方式。
Nimbus:在Storm主控节点上运行(即test1节点),启动Nimbus后台程序,并放到后台执行。
su hadoop
bin/storm nimbus </dev/null 2<&1 &
Supervisor:在Storm各个工作节点上运行(即test2、test3节点),启动Supervisor后台程序,并放到后台执行。
su hadoop
bin/storm supervisor </dev/null 2<&1 &
UI:在Storm主控节点上运行,启动UI后台程序,并放到后台执行,启动后可以通过http://{nimbus host}:8080
观察集群的Worker资源使用情况、Topology的运行状态等信息,启动命令如下。启动后通过浏览器可以查看当前Storm集群的当前状态,成功启动后的Storm UI界面如图2-2所示。
su hadoop
bin/storm ui </dev/null 2<&1 &
经测试,Storm UI必须和Storm Nimbus部署在同一台机器上,否则UI无法正常工作,因为UI进程会检查本机是否存在Nimus连接。
下面简单介绍Storm UI页面上的各项属性。
1.?Cluster Summary集群统计信息
Version:Storm集群的版本。
Nimbus uptime:Nimbus的启动时间。
Supervisors:Storm集群中Supervisor的数量。
Used slots:使用的Slot数。
Free slots:剩余的Slot数。
Total slots:总的Slot数。
Executors:执行者数量。
Tasks: 运行的任务数。
2.?Topology summary拓扑统计信息
Name:拓扑的名称。
Id:由Storm生成的拓扑ID。
Status:拓扑的状态,包括ACTIVE、INACTIVE、KILLED、REBALANCING等。
Uptime:拓扑运行的时间。
Num workers:运行的Worker数。
Num executors:运行的执行者数。
Num tasks:运行的Task数。
3.?Supervisor summary工作节点统计信息
Host:Supervisor主机名。
Id:由Storm生成的工作节点ID。
Uptime:Supervisor启动的时间。
Slots:Supervisor的Slot数。
Used slots:使用的Slot数。
经测试,Storm UI必须和Nimbus服务部署在同一节点上,否则UI无法正常工作,因为UI进程会检查本机是否存在Nimbus连接。至此,Storm集群部署、配置完成,可以向集群提交拓扑。
2.3.4 停止Storm集群
在本地模式下停止集群的方式比较简单,就是调用shutdown方法,代码如下:
import backtype.storm.LocalCluster;
LocalCluster cluster = new LocalCluster();
cluster.shutdown();
分布式模式停止集群的方式比较麻烦,因为角色进程分布在不同的节点上。停止的方法是,直接杀掉每个节点运行的Nimbus或者Supervisor进程。目前Storm官网上提供了一个项目可以快速关闭Storm集群。