Storm基础篇二—创建一个Storm集群

752 阅读6分钟

Storm启动、运行的步骤

以下是创建storm集群步骤的总结:

  1. 搭建zookeeper集群:
  2. 安装Nimbus和worker所需依赖
  3. 下载 Storm 安装程序并解压缩到集群的各个机器上
  4. 在storm.yaml中填写集群配置信息
  5. 在你选择的监控程序下,通过“storm”脚本启动进程
  6. 设置DRPC服务器(可选)

一、搭建zookeeper集群

Storm使用zookeeper来协调集群。Zookeeper不用于消息传递,所以Storm在zookeeper上的负载较低。在大多数情况下,单节点zookeeper集群就足够了,但是如果你需要更可靠的故障转移机制(failover)或者需要部署大规模的storm集群,你最好配置一个zookeeper集群。 zookeeper集群步骤请参考 此文

关于zookeeper部署的一些注意事项:

  1. Zookeeper集群必须在监控模式下运行,因为Zookeeper是一个快速失败系统,如果遇到故障,zookeeper会自动退出。更多详情,请见此文
  2. 需要设置一个 cron 服务来定时压缩 ZooKeeper 的数据与事务日志非常重要。因为 ZooKeeper 的后台进程不会处理这个问题,如果不配置 cron,ZooKeeper 的日志会很快填满磁盘空间。 更多详情,请见 此文

实践:

  1. 配置单个zookeeper服务

    1. 下载zookeeper,创建zookeeper文件夹,并解压文件。
    tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz
    
    1. 创建和配置myid文件。
    cd apache-zookeeper-3.7.0-bin
    mkdir data
    cd data
    touch myid
    在myid文件中写入1
    
    1. 修改zookeeper配置文件,示例如下:
    cd ../conf
    cp zoo_sample.cfg zoo.cfg
    vi zoo.cfg
    修改部分如下:
    dataDir=/data/zookeeper/apache-zookeeper-3.7.0-bin/data
    
    server.1=192.168.52.106:2888:3888
    server.2=192.168.52.100:2888:3888
    server.3=192.168.52.105:2888:3888
    
    # the port at which the clients will connect
    clientPort=2186
    
  2. 配置zookeeper集群,将配置好的zookeeper复制到其余两台机器上,注意:修改对应的myid,改为和server.x对应的x。

  3. 启动zookeeper服务。

进入对应的zookeeper文件夹
cd /data/zookeeper/apache-zookeeper-3.7.0-bin/bin/
./zkServer.sh start
  1. 验证
./zkServer.sh status ,有相应的mode信息(leader、follower)即可。

二、安装Nimbus和worker所需依赖

接下来你需要在Nimbus和worker机器上安装所需的依赖组件,包括:

  1. Java 8+ (Apache Storm 2.x is tested through travis ci against a java 8 JDK)
  2. Python 2.7.x or Python 3.x 这些是Storm测试过的依赖版本。Storm在其他版本的Java 和/或Python不一定支持。
    实践:
mkdir -p /data/java    配置java目录
tar -zxvf jdk-8u301-linux-x64.tar.gz
vi /etc/profile   加入

export JAVA_HOME=/data/java/jdk1.8.0_301
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

source /etc/profile  
java -version  出现相应版本号即成功

mkdir -p /data/python  配置python目录
tar -zxvf Python-2.7.16.tgz
cd Python-2.7.16
./configure --prefix=/data/python/python2  编译安装
make
make install
rm -f /usr/bin/python  删除原有链接,并创建新链接
ln -s /data/python/python2/bin/python /usr/bin/python
python  出现相应版本号即成功

三、下载 Storm 安装程序并解压缩到集群的各个机器上

接下来,下载一个Storm版本并在各个机器上解压。Storm所有版本均可在 此处下载。
实践:

mkdir -p /data/storm
tar -zxvf apache-storm-2.2.0.tar.gz

四、在storm.yaml中配置集群信息

Storm包含 conf/storm.yaml 配置文件用来配置storm进程。你可以通过 默认配置文件查看相关默认值。重写后的storm.yaml将覆盖默认配置文件defaults.yaml。为了使集群能正常工作,以下配置是必须的:

  1. storm.zookeeper.servers: 这是你Storm集群中关联的zookeeper集群的地址。配置如下所示:
storm.zookeeper.servers:
  - "111.222.333.444"
  - "555.666.777.888"

如果你zookeeper集群使用的端口不是默认端口,你应当相应的设置storm.zookeeper.port参数。

  1. storm.local.dir: Nimbus和Supervisor进程需要一个本地目录用于存储少量的状态信息(like jars, confs, and things like that)。应当在每台机器上创建该目录,给予适当权限,并将该目录写进配置文件中,示例如下:
storm.local.dir: "/mnt/storm"

如果storm运行在windows下,示例如下:

storm.local.dir: "C:\storm-local"

如果你使用的是相对路径,相对的是storm安装的根目录(STORM_HONE),你可以使用默认值$STORM_HOME/storm-local并保留为空(原文为leave it empty,这样翻译不知道准不准)

  1. nimbus.seeds: Worker节点需要知道集群中的哪台机器是master,以便从master上下载topology以及配置文件等,示例如下:
nimbus.seeds: ["111.222.333.44"]

You're encouraged to fill out the value to list of machine's FQDN. If you want to set up Nimbus H/A, you have to address all machines' FQDN which run nimbus. You may want to leave it to default value when you just want to set up 'pseudo-distributed' cluster, but you're still encouraged to fill out FQDN.

  1. supervisor.slots.ports: 对于每台worker机器(supervisor),你可以通过此项配置设置每台机器上可以运行多少个worker。每个worker使用一个端口用于接收消息,此项配置项定义了 worker 可以使用的端口列表。如果你定义了5个端口, 那么storm在这台机器上最多可分配5个worker。如果你定义了3个端口, Storm最多将运行3个worker。默认情况下,此项配置为在6700、6701、6702和6703端口上运行4个worker,示例如下:
supervisor.slots.ports:
    - 6700
    - 6701
    - 6702
    - 6703
  1. drpc.servers: 如果你想设置DRPC服务器,需要指定它们ip,以便worker找到它们。此项设置应该为一个DRPC服务器列表。示例如下:
drpc.servers: ["111.222.333.44"]

实践:

cd /data/storm/apache-storm-2.2.0/conf
vi storm.yaml

五、监视Supervisors的运行情况

Storm提供了一种机制,管理员可以通过这种机制配置管理器,使其定期运行管理员提供的脚本,以确定节点是否健康。管理员可以让supervisor执行storm.health.check.dir目录下的脚本中执行他们所需的任何检查,以确定节点是否处于健康状态。如果脚本检测到节点处于不健康状态,它将返回一个非零的值。在前Storm 2.x的版本中,有一个 bug 为脚本返回0失败,现已修复。Supervisor会定期运行健康检查目录下的脚本并检查输出。如果脚本的输出包含如上所述的字符串 ERRO,Supervisor将shutdown worker并退出。(If the script’s output contains the string ERROR, as described above, the supervisor will shut down any workers and exit.)

如果supervisor在监控程序下运行,则可以调用/bin/storm node-health-check来确定是否应该启动supervisor或者确定节点是否不健康。

健康检查目录配置示例如下:

storm.health.check.dir: "healthchecks"

脚本必须具有执行权限,在由超时引起的失败之前,允许健康检查脚本运行的时间设置示例如下:

storm.health.check.timeout.ms: 5000

六、配置外部库和环境变量(可选)

如果你需要使用某些外部库或者定制插件的功能,你可以将相关 jar 包放入 extlib/ 与 extlib-daemon 目录下。注意,extlib-daemon 目录仅仅用于存储相关进程(Nimbus, Supervisor, DRPC, UI, Logviewer)所需的 jar 包,例如,HDFS 以及定制的调度库。此外,可以使用STORM_EXT_CLASSPATHSTORM_EXT_CLASSPATH_DAEMON两个环境变量来配置普通外部库与“仅用于相关进程”外部库的 classpath。 使用外部库,更多详情见Classpath handling

七、在你选择的监控程序下,通过“storm”脚本启动进程

最后一步就是启动所有的Storm进程。在监测程序下运行这些进程是非常重要的。Storm是一个快速失败系统,这就意味着一旦遇到意外错误,Storm就会停止。Storm这样设计是为了确保 Storm 进程可以在任何时刻安全地停止并且在进程重新启动之后恢复正常。这也是 Storm 不在处理过程中保存任何状态的原因 —— 在这种情况下,如果有 Nimbus 或者 Supervisor 重新启动,运行中的拓扑不会受到任何影响。下面是启动Storm进程的方法:

  1. Nimbus: 在监测程序下,在master上执行bin/storm nimbus 命令。
  2. Supervisor: 在监测程序下,在每台worker机器上执行 bin/storm supervisor 命令。Supervisor进程负责启动和停止该机器上的worker进程。
  3. UI: 在监测程序下,通过执行bin/storm ui命令运行Storm UI (您可以从浏览器访问站点,通过浏览器访问 http://{ui host}:8080,它提供关于集群和拓扑的诊断)。

可以看出,启动相关进程非常简单。进程也会将日志信息记录到 Storm 安装程序的logs/目录中。

Setup DRPC servers (Optional)

Just like with nimbus or the supervisors you will need to launch the drpc server. To do this run the command bin/storm drpc on each of the machines that you configured as a part of the drpc.servers config.

DRPC Http Setup

DRPC optionally offers a REST API as well. To enable this set teh config drpc.http.port to the port you want to run on before launching the DRPC server. See the REST documentation for more information on how to use it.

It also supports SSL by setting drpc.https.port along with the keystore and optional truststore similar to how you would configure the UI.

该博客仅为初学者自我学习的记录,粗浅之言,如有不对之处,恳请指正。

参考资料

Storm Document -> Setting up a Storm Cluster