本文共 7407 字,大约阅读时间需要 24 分钟。
本节书摘来自华章计算机《Storm企业级应用:实战、运维和调优》一书中的第2章,第2.3节,作者:马延辉 陈书美 雷葆华著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
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.?安装ZeroMQStorm底层队列的实现使用ZeroMQ,为了实现低耦合,Storm并没有将ZeroMQ放置到其工程中,所以需要预先安装。先下载源码,然后编译安装ZeroMQ,命令如下:wget http:// download.zeromq.org/zeromq-2.1.7.tar.gztar -vxzf zeromq-2.1.7.tar.gzcd zeromq-2.1.7./conf?iguremakemake 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.?安装JZMQJZMQ是ZeroMQ的Java语言的绑定实现,因为安装过程中使用unzip命令,首先要使用yum等的安装工具安装unzip工具。然后根据下面的代码一步一步下载、配置、编译和安装JZMQ。#安装依赖工具包yum install pkgconf?ig libtool#下载、配置、编译和安装wget https:// github.com/nathanmarz/jzmq/archive/master.zip -O jzmq.zipunzip jzmq.zipcd jzmq-master./autogen.sh./conf?iguremakemake 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.yamljava.library.path: "/usr/local/lib:/opt/local/lib:/usr/lib"### storm.* conf?igs are general conf?igurations# the local dir is where jars are keptstorm.local.dir: "storm-local"storm.zookeeper.servers: - "localhost"storm.zookeeper.port: 2181storm.zookeeper.root: "/storm"storm.zookeeper.session.timeout: 20000storm.zookeeper.connection.timeout: 15000storm.zookeeper.retry.times: 5storm.zookeeper.retry.interval: 1000storm.cluster.mode: "distributed" # can be distributed or localstorm.local.mode.zmq: false### nimbus.* conf?igs are for the masternimbus.host: "localhost"nimbus.thrift.port: 6627nimbus.childopts: "-Xmx1024m"nimbus.task.timeout.secs: 30nimbus.supervisor.timeout.secs: 60nimbus.monitor.freq.secs: 10nimbus.cleanup.inbox.freq.secs: 600nimbus.inbox.jar.expiration.secs: 3600nimbus.task.launch.secs: 120nimbus.reassign: truenimbus.f?ile.copy.expiration.secs: 600### ui.* conf?igs are for the masterui.port: 8080ui.childopts: "-Xmx768m"drpc.port: 3772drpc.invocations.port: 3773drpc.request.timeout.secs: 600transactional.zookeeper.root: "/transactional"transactional.zookeeper.servers: nulltransactional.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 communicationsupervisor.slots.ports: - 6700 - 6701 - 6702 - 6703supervisor.childopts: "-Xmx1024m"#how long supervisor will wait to ensure that a worker process is startedsupervisor.worker.start.timeout.secs: 120#how long between heartbeats until supervisor considers that worker dead and tries to restart itsupervisor.worker.timeout.secs: 30#how frequently the supervisor checks on the status of the processes it's monitoring and restarts if necessarysupervisor.monitor.frequency.secs: 3#how frequently the supervisor heartbeats to the cluster state (for nimbus)supervisor.heartbeat.frequency.secs: 5supervisor.enable: true### worker.* conf?igs are for task workersworker.childopts: "-Xmx768m"worker.heartbeat.frequency.secs: 1task.heartbeat.frequency.secs: 3task.refresh.poll.secs: 10zmq.threads: 1zmq.linger.millis: 5000### topology.* conf?igs are for specif?ic executing stormstopology.enable.message.timeouts: truetopology.debug: falsetopology.optimize: truetopology.workers: 1topology.acker.executors: 1topology.acker.tasks: nulltopology.tasks: null# maximum amount of time a message has to complete before it's considered failedtopology.message.timeout.secs: 30topology.skip.missing.kryo.registrations: falsetopology.max.task.parallelism: nulltopology.max.spout.pending: nulltopology.state.synchronization.timeout.secs: 60topology.stats.sample.rate: 0.05topology.fall.back.on.java.serialization: truetopology.worker.childopts: nulltopology.executor.receive.buffer.size: 1024 #batchedtopology.executor.send.buffer.size: 1024 #individual messagestopology.receiver.buffer.size: 8 # setting it too high causes a lot of problems (heartbeat thread gets starved, throughput plummets)topology.transfer.buffer.size: 1024 # batchedtopology.tick.tuple.freq.secs: nulltopology.worker.shared.thread.pool.size: 4topology.disruptor.wait.strategy: "com.lmax.disruptor.BlockingWaitStrategy"topology.spout.wait.strategy: "backtype.storm.spout.SleepSpoutWaitStrategy"topology.sleep.spout.wait.strategy.time.ms: 1dev.zookeeper.path: "/tmp/dev-storm-zookeeper"
2.3.3 启动Storm集群
最后一步,启动Storm的所有后台进程。和ZooKeeper一样,Storm也是快速失败(fail-fast)的系统,能在任意时刻被停止,并且当进程重启后能够正确恢复执行。这也是为什么Storm不在进程内保存状态的原因,即使重启Nimbus或Supervisor进程,运行中的Topology不会受到影响。首先,还是因为需要使用hadoop用户启动进程,需要更改文件权限,命令如下:mkdir /var/stormchown -R hadoop:hadoop /var/stormchown -R hadoop:hadoop /opt/modules/*storm*
下面介绍启动Storm各个后台进程的方式。
Nimbus:在Storm主控节点上运行(即test1节点),启动Nimbus后台程序,并放到后台执行。su hadoopbin/storm nimbus
Supervisor:在Storm各个工作节点上运行(即test2、test3节点),启动Supervisor后台程序,并放到后台执行。
su hadoopbin/storm supervisor
UI:在Storm主控节点上运行,启动UI后台程序,并放到后台执行,启动后可以通过http://{nimbus host}:8080
观察集群的Worker资源使用情况、Topology的运行状态等信息,启动命令如下。启动后通过浏览器可以查看当前Storm集群的当前状态,成功启动后的Storm UI界面如图2-2所示。
su hadoopbin/storm ui
经测试,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集群。
转载地址:http://ifzoa.baihongyu.com/