Storm集群的安装部署

内容

  1. Storm简介
  2. 搭建ZooKeeper集群
  3. 搭建Storm集群
  4. 用Supervisor管理ZooKeeper和Storm

Storm简介

  • Storm节点
    Storm集群中包含两类节点:nimbus和supervisor。nimbus是集群中的主控节点,负责在集群内分发代码,分配任务给supervisor节点,并且负责监控集群运行状态。supervisor是具体的工作节点,负责监听从nimbus分配给它执行的任务,据此管理执行任务的工作进程。nimbus和supervisor之间的协调工作通过Zookeeper集群来实现,如下图所示:
  • 本文的步骤
    1. 搭建ZooKeeper集群
    2. 搭建Storm集群
    3. 用Supervisor管理ZooKeeper和Storm
  • 本文所涉及的物理节点
物理机IPOS硬盘内存
192.168.0.177Red Hat 6.5 / 64150G3G
192.168.0.179Red Hat 6.5 / 64250G3G
192.168.0.250Red Hat 6.5 / 64150G3G
  • 本文所涉及的软件

|软件|版本|前置条件|安装路径|安装节点|
|:–:|:–:|:–:|:–:|
|Zookeeper|3.4.6|JRE 6 or later|/opt/zookeeper|所有节点|
|Storm|0.9.6|JRE 6 or later
Python 2.6.6 or later
ZooKeeper|/opt/storm|Nimbus:
192.168.0.179
Supervisor:
192.168.0.250
192.168.0.177
192.168.0.179|
|Supervisor|3.1.3|–|–|所有节点|

搭建ZooKeeper集群

  • 准备
    Oracle官网下载安装JRE/JDK,或使用下面的命令安装OpenJDK

    1
    yum install java-1.6.0-openjdk
  • 下载
    点击这里从官方下载最新的ZooKeeper Release版本,并解压到集群中每台需要部署Storm的服务器上,这里均解压到/opt/zookeeper3.4.6/ ,然后创建软链

    1
    2
    [root@192.168.0.177 ~]#tar zxvf zookeeper-3.4.6.tar.gz
    [root@192.168.0.177 ~]#ln -s /opt/zookeeper3.4.6/ /opt/zookeeper
  • 配置
    conf路径下创建配置文件zoo.cfg, 可以参考以下配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    [root@192.168.0.177 ~]#cat /opt/zookeeper/conf/zoo.cfg
    The number of milliseconds of each tick
    tickTime=2000
    # The number of ticks that the initial
    # synchronization phase can take
    initLimit=10
    # The number of ticks that can pass between
    # sending a request and getting an acknowledgement
    syncLimit=5
    # the directory where the snapshot is stored.
    # do not use /tmp for storage, /tmp here is just
    # example sakes.
    dataDir=/opt/zookeeper/data
    # the port at which the clients will connect
    clientPort=2181
    # the maximum number of client connections.
    # increase this if you need to handle more clients
    #maxClientCnxns=60
    #
    # Be sure to read the maintenance section of the
    # administrator guide before turning on autopurge.
    #
    # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
    #
    # The number of snapshots to retain in dataDir
    autopurge.snapRetainCount=3
    # Purge task interval in hours
    # Set to "0" to disable auto purge feature
    autopurge.purgeInterval=5
    server.1=192.168.0.177:2888:3888
    server.2=192.168.0.250:2888:3888
    server.3=192.168.0.179:2888:3888

    ZooKeeper集群中的每台server需要互相通信,故需要按照server.id=host:port:port的格式配置各ZooKeeper节点的信息。而配置文件中的dataDir参数配置了ZooKeeper的数据存储地址,该路径下需要创建一个名为myid的文件,用来存储该节点在ZooKeeper集群中的序号,即server.id中的id

    1
    2
    3
    4
    5
    6
    [root@192.168.0.177 ~]cat /opt/zookeeper/data/myid
    1
    [root@192.168.0.250 ~]cat /opt/zookeeper/data/myid
    2
    [root@192.168.0.179 ~]cat /opt/zookeeper/data/myid
    3
  • 启动
    使用zkServer.sh脚本启动ZooKeeper进程

    1
    /opt/zookeeper/bin/zkServer.sh start

    由于Zookeeper是快速失败(fail-fast)的,且遇到错误情况进程会退出,因此,最好能通过监控程序将Zookeeper管理起来,保证Zookeeper退出后能被自动重启。详情参考这里

    有网友提到,当在的Supervisor等监控程序下启动时,最好在命令后再加上start-foreground,以保证监控程序能正常地运行:

    When running zookeeper under supervision, use “zkServer.sh start- foreground” instead of “zkServer.sh start”. The regular start command forks and exits too many times for supervisord to track the application state successfully.
    转载自 https://groups.google.com/d/msg/storm-user/_L6i2JLjQwA/H1LMX2s6JV4J

  • 验证
    运行zkCli.sh连接Zookeeper启动交互式命令行,验证是否运行成功。在命令行中可以执行类似操作系统的文件命令,如lsrm,来管理集群中的文件

    1
    2
    3
    4
    5
    6
    7
    [root@192.168.0.177 ~]#/opt/zookeeper/bin/zkCli.sh
    Connecting to localhost:2181
    2016-04-20 02:40:44,256 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09
    WATCHER::
    ...
    WatchedEvent state:SyncConnected type:None path:null
    [zk: localhost:2181(CONNECTED) 0]

    注意:Zookeeper运行过程中会在dataDir目录下生成很多日志和快照文件,而Zookeeper进程并不负责定期清理合并这些文件,导致占用大量磁盘空间,因此,需要通过cron等方式定期清除没用的日志和快照文件。详情参考这里

搭建Storm集群

  • 准备
    Redhat或CentOS系统中会默认安装Python,确保其版本在2.6.6,否则对其进行更新。

  • 下载
    点击这里从官网下载Storm的压缩包,解压到集群中每台需要部署Storm的服务器上,然后创建软链

    1
    2
    [root@192.168.0.177 ~]#unzip apache-storm-0.9.6.zip -D /opt/
    [root@192.168.0.177 ~]#ln -s /opt/apache-storm-0.9.6 /opt/storm
  • 配置
    创建Storm的数据存储路径

    1
    [root@192.168.0.177 ~]# mkdir /mnt/storm

    在配置文件conf/storm.yaml中新增如下内容:

    1
    2
    3
    4
    5
    6
    7
    storm.zookeeper.servers:
    - "192.168.0.177"
    - "192.168.0.179"
    - "192.168.0.250"
    storm.local.dir: "/mnt/storm"
    nimbus.host: "192.168.0.177"
    ui.port: 8080

    其中nimbus.host指定了即将要启动的nimbus服务的ip或hostname。

  • 启动
    bin/storm来启动Storm的三种服务:nimbus,supervisor和ui,如

    1
    [root@192.168.0.177 ~]#/opt/storm/bin/storm nimbus >/dev/null 2>&1 &

    会在192.168.0.177上启动nimbus,命令中的>/dev/null 2>&1 &让进程在后台运行,否则该进程会一直运行在当前的shell会话中。
    用相同的方式在在192.168.0.177上启动supervisor和ui,在其他的节点上启动supervisor进程。

    1
    2
    /opt/storm/bin/storm supervisor >/dev/null 2>&1 &
    /opt/storm/bin/storm ui >/dev/null 2>&1 &

    此时包含一个nimbus节点和三个supervisor节点的Storm集群已经搭建完毕。到http://192.168.0.177:8080访问Storm的ui可以看到集群中的节点的的信息。三种服务启动的日志可以到/opt/storm/logs路径下获取。

    需要注意的是,Storm同样是快速失败的,这样Storm才能在任意时刻被停止,并且当进程重启后被正确地恢复执行。这也是为什么Storm不在进程内保存状态的原因,即使nimbus或supervisor被重启,运行中的topology也不会受到影响。

用Supervisor管理ZooKeeper和Storm

这里不要与Storm的supervisor混淆,Supervisor是一个Unix体系下的C/S模式的进程管理程序,它能够让用户监控和管理大量的线程,类似的程序还有launchddaemontools等,。用Supervisor可以轻松地管理ZooKeeper和Storm,当他们失败的时候Supervisor会自动将其重启。

  • 安装
    使用如下命令在Redhat或者CentOs下安装Supervisor,并设置为开机自动启动
    1
    2
    yum install supervisor
    chkconfig supervisord on
  • 配置
    /etc/supervisord.conf中添加ZooKeeper相关配置。注意要保证logfile所配置的日志文件的路径在系统中存在。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [program:zoo-keeper]
    command=/opt/zookeeper/bin/zkServer.sh start-foreground
    user=root
    autostart=true
    autorestart=true
    startsecs=10
    startretries=999
    log_stdout=true
    log_stderr=true
    logfile=/opt/zookeeper/logs/supervisord-zookeeper.out
    logfile_maxbytes=20MB
    logfile_backups=10
    添加Storm,这里以nimbus服务为例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [program:storm-nimbus]
    command=/opt/storm/bin/storm nimbus
    user=root
    autostart=true
    autorestart=true
    startsecs=10
    startretries=999
    log_stdout=true
    log_stderr=true
    logfile=/opt/storm/logs/supervisord-nimbus.out
    logfile_maxbytes=20MB
    logfile_backups=10
  • 启动
    启动supervisord服务:
    1
    service supervisord start
    查看所有服务的当前运行状态
    1
    2
    3
    4
    5
    [root@192.168.0.177 ~]#supervisorctl status
    storm-nimbus RUNNING pid 599, uptime 10:56:28
    storm-supervisor RUNNING pid 637, uptime 10:56:22
    storm-ui RUNNING pid 674, uptime 10:56:16
    zoo-keeper RUNNING pid 31233, uptime 11:40:57

参考

  1. Storm集群安装部署步骤【详细版】
  2. Running a Multi-Node Storm Cluster
  3. Learning Storm