Storm安装笔记

更新于 2019-04-04  约 18 分钟

Storm安装笔记

安装环境

三台服务器10.223.138.[141-143]

  • CentOS release 6.7 (Final) 64位
  • JDK 1.7.0_80

    It is strongly recommended to use Oracle JDK rather than OpenJDK.
  • CDH 5.7.0

本次安装Storm版本为1.1.0
官网地址 请点击我
官方文档 Version: 1.1.0
安装文档 Setting up a Storm Cluster

安装Zookeeper集群

CDH安装Zookeeper服务,此处略
Zookeeper version:zookeeper-3.4.5-cdh5.7.0

  • 10.223.138.141:2181
  • 10.223.138.142:2181
  • 10.223.138.143:2181

官方建议:

A few notes about Zookeeper deployment:

  1. It's critical that you run Zookeeper under supervision, since Zookeeper is fail-fast and will exit the process if it encounters any error case. See here for more details.
  2. It's critical that you set up a cron to compact Zookeeper's data and transaction logs. The Zookeeper daemon does not do this on its own, and if you don't set up a cron, Zookeeper will quickly run out of disk space. See here for more details.
  • 进程监控以避免任何错误导致的程序退出
  • 定时压缩数据和日志以避免可能引发的磁盘空间不足

安装依赖

安装Storm所需要的依赖

  1. Java 7
  2. Python 2.6.6

JDK 7 下载地址 请点击我
CenOS 6.7自带Python 2.6.6

# python -V
Python 2.6.6

以上安装方法此处不再赘述,可自行网上查阅。

下载Storm包

下载地址 apache-storm-1.1.0.tar.gz
将压缩包解压到指定目录tar -zxvf apache-storm-1.1.0.tar.gz -C /your/path/

配置storm.yaml

The Storm release contains a file at conf/storm.yaml that configures the Storm daemons. You can see the default configuration values here. storm.yaml overrides anything in defaults.yaml.

配置文件位置conf/storm.yaml,以下是用以启动集群的必要配置

  • storm.zookeeper.servers:Zookeeper集群配置
storm.zookeeper.servers:
  - "10.223.138.141"
  - "10.223.138.142"
  - "10.223.138.143"

如果端口不是默认的2181还需要配置storm.zookeeper.port参数

  • storm.local.dir:存储目录用以保存运行环境,比如jar包、配置文件等,在每台机器上手动创建目录并赋权限
storm.local.dir: "/home/storm"
  • nimbus.seeds:master节点,官方建议配置machine's FQDN,即全域名。维基百科Fully_qualified_domain_name。本机查看命令hostname -f,修改方法请自行网上查阅。(配置多个Nimbus角色的机器可以启动Nimbus H/A。)
nimbus.seeds: ["cdh-1"]

原来我使用的是10.223.138.141,但是storm ui上Nimbus Summary出现了两行数据,一个是cdh-1,一个是10.223.138.141这种奇怪的问题,但是换成了全域名的这种形式就没问题了。

  • supervisor.slots.ports:对应每一台Worker机器,定义一台机器上跑几个worker就配置几个端口,比如我这边一个机器上跑三个worker,配置如下
supervisor.slots.ports:
- 6700
- 6701
- 6702
  • 健康度监控
# 脚本相关文件的存放目录
storm.health.check.dir: "/home/storm/healthchecks"
# 脚本执行的超时时间
storm.health.check.timeout.ms: 5000

配置第三方库和环境变量

如果需要扩展第三方库或自定义插件,把jar包放入extlib/或者extlib-daemon/目录,extlib-daemon/这个里面只能被Storm的程序所使用,比如(Nimbus, Supervisor, DRPC, UI, Logviewer)这些,也可以通过环境变量STORM_EXT_CLASSPATHSTORM_EXT_CLASSPATH_DAEMON去配置扩展库classpath目录。

启动

  1. Nimbus: Nimbus角色的机器执行命令bin/storm nimbus &
  2. Supervisor: Worker角色的机器执行命令bin/storm supervisor &,它用于启停Worker进程。
  3. UI: 某一台机器执行命令bin/storm ui &,然后可以通过浏览器访问http://{ui host}:8080。

logs/ 此目录下可查看运行日志。

进程监控

在Setting up a Storm Cluster这份官方安装文档中强烈建议run under supervision,引用官方文档的原话(原文地址:Daemon-Fault-Tolerance

What happens when Nimbus or Supervisor daemons die?
The Nimbus and Supervisor daemons are designed to be fail-fast (process self-destructs whenever any unexpected situation is encountered) and stateless (all state is kept in Zookeeper or on disk). As described in Setting up a Storm cluster, the Nimbus and Supervisor daemons must be run under supervision using a tool like daemontools or monit. So if the Nimbus or Supervisor daemons die, they restart like nothing happened.

当Nimbus或者Supervisor daemon进程挂了会怎样?
Nimbus和Supervisor daemon进程设计成快速失败(无论何时遇到任何异常情况执行自毁)和无状态(所有状态保存在Zookeeper或者磁盘上)。正如Setting up a Storm Cluster中描述的,Nimbus和Supervior daemon进程必须在监控下运行,如使用daemontools或者monit工具。所以如果Nimbus或者Supervisor daemon进程挂了,它可以像什么异常也没有发生似的重新启动。

这里我使用monit,详细介绍请参阅官网。(官网地址请点击我

安装monit

安装命令yum install monit,如果没有找到的话,需要先安装epel源yum install epel-release
配置文件位置 /etc/monit.conf,分为Global section和Services两个部分

  • 配置Global section,以下是我个人的Global配置:(邮件功能暂略)
set daemon  60                    #每60秒检查一次服务
    with start delay 240        #Monit启动后第一次检查延迟240秒
set logfile /var/log/monit.log    #日志输出到单独的文件
set pidfile /var/run/.monit.pid    #pid文件位置
set idfile /var/.monit.id        #id文件位置
set statefile /var/.monit.state    #state文件位置
#配置web页面访问
set httpd port 2812 and            #端口2812
    use address 10.223.138.141    #如果配置localhost只能本地访问
    allow localhost                #允许本地访问
    allow 10.223.138.141        #若不配置,monit status命令不可用,后台报错
                                #error    : Denied connection from non-authorized client
                                #error    : Cannot read status from the monit daemon
    allow 10.223.132.0/24        #允许10.223.132网段访问,即我的电脑所在网段
    allow admin:monit              #用户名与密码

中间插一下:如果使用防火墙,要访问的话还需要把2812端口加入防火墙配置,编辑防火墙配置文件/etc/sysconfig/iptables增加一行配置:-A INPUT -m state --state NEW -m tcp -p tcp --dport 2812 -j ACCEPT
注意:需要在相应的配置段中加入,其他位置不生效

.
.
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2812 -j ACCEPT
.
.

重启服务service iptables restart

  • 配置Services

这里把Services的配置和全局配置分开,在/etc/monit.d/下面新建文件nimbus和supervisor作为监控nimbus和supervisor的配置。
这里主要是监控nimbus和supervisor的进程,我们只看monit监控进程的语法
CHECK PROCESS <unique name> <PIDFILE <path> | MATCHING <regex>>
有两种方式,一个是pidfile,一个是正则匹配进程名,因为storm的deamon没写pid文件,这里我用第二种方法,使用monit procmatch命令验证是否可以匹配相应的进程,例如nimbus的进程,Command里面最后有org.apache.storm.daemon.nimbus

#monit procmatch org.apache.storm.daemon.nimbus
List of processes matching pattern "org.apache.storm.daemon.nimbus":
------------------------------------------
...此处省略...
------------------------------------------
Total matches: 1

匹配到nimbus的进程,表示OK。

#vi /etc/monit.d/nimbus
check process nimbus matching org.apache.storm.daemon.nimbus
  start program = "/bin/bash -c '/home/storm/apache-storm-1.1.0/bin/nimbus.sh &>/tmp/nimbus.out'" with timeout 60 seconds
  stop program = "/bin/kill -9 `ps -ef|grep daemon.nimbus|grep -v grep|awk '{print $2}'`"
  if 3 restarts within 5 cycles then unmonitor
  group storm

关于monit更为详细的说明请参见官方手册 Monit manual

以上设置的很简单,这里得好好说说这个start program,就是启动的命令,它可是实现进程挂掉后重启,但是我一开始试了好几种方式都不行

  • 直接执行,/home/storm/apache-storm-1.1.0/bin/storm nimbus,启动超时
  • 放入后台,/home/storm/apache-storm-1.1.0/bin/storm nimbus &,程序会自行终结
  • 创建脚本文件/home/storm/apache-storm-1.1.0/bin/nimbus.sh

    /home/storm/apache-storm-1.1.0/bin/storm nimbus &

    脚本“&”符号还是要的,不然PPID是monit的。
    给执行权限chmod 755 /home/storm/apache-storm-1.1.0/bin/nimbus.sh

    不管是/home/storm/apache-storm-1.1.0/bin/nimbus.sh还是/bin/bash /home/storm/apache-storm-1.1.0/bin/nimbus.sh都不能实现自动重启。

  • 参考monit的FAQ(请点击我)使用/bin/bash -c执行但是后面必须要有一个输出的文件,没有会报错:

    error    : 'nimbus' failed to start (exit status 0) -- no output

所以经过好一番折腾,最终 start program = "/bin/bash -c '/home/storm/apache-storm-1.1.0/bin/nimbus.sh &>/tmp/nimbus.out'",nimbus.sh就是上面提到的那个脚本文件。我觉得这应该不是最正确的配置,但是至少可以实现重启了。

supervisor同理

#vi /etc/monit.d/supervisor
check process supervisor matching org.apache.storm.daemon.supervisor.Supervisor
  start program = "/bin/bash -c '/home/storm/apache-storm-1.1.0/bin/supervisor.sh &>/tmp/supervisor.out'" with timeout 60 seconds
  stop program = "/bin/kill -9 `ps -ef|grep daemon.supervisor|grep -v grep|awk '{print $2}'`"
  if 3 restarts within 5 cycles then unmonitor
  group storm

这样就算配置完成了。141配置nimbus,然后141-143配置supervisor,三台机器都装了Monit,虽然M/Monit可以统一管理集群,但是需要收费,这边就没有考虑了。后面再尝试使用其他监控工具试试。

接下来就是启动monit,先熟悉monit的基本命令

  • monit 启动
  • monit -t 校验配置文件正确性
  • monit reload 重新加载配置
  • monit status 查看状态
  • monit quit 退出

所以当修改完配置文件之后,第一步执行monit -t查看配置是否正确,然后monit reload重新加载配置。

monit启动之后可以登录web查看,根据Global里面的配置,我的页面地址是:http://10.223.138.141:2812/
Monit-UI

启动storm的UI后查看,我在10.223.138.141上启动的,访问地址为:10.223.138.141:8080不要忘记防火墙!
Storm-UI

至此,Storm安装完毕!

参考

阅读 341更新于 2019-04-04

推荐阅读
目录