Storm 系列(三)Storm 集群部署和配置

时间:2024-06-19 09:06:56

Storm 系列(二)Storm 集群部署和配置

本章中主要介绍了 Storm 的部署过程以及相关的配置信息。通过本章内容,帮助读者从零开始搭建一个 Storm 集群。

一、Storm 的依赖组件

1.1 要部署 Storm,需要要部署以下几个相关组件。

  1. JDK :从 Oracle 官网下载,设置环境变量(JAVA_HOME、PATH 和 CLASSPATH)。
  2. Zookeeper :安装详见(http://www.cnblogs.com/binarylei/p/8721129.html),Storm 本身重度依赖于 Zookeeper。
  3. Python :安装详见(http://www.cnblogs.com/binarylei/p/8792902.html),Linux 一般自带 Python。
  4. Storm :Storm 官方地址(http://storm.apache.org/)。

1.2 Storm 集群分为 Nimbus 节点和 Supervisor 节点。

  • Nimbus 节点 :用于提交应用 Topology、管理整个 Storm 节点(将 Topology 的 Task 分配给 Worker、监控各个 Supervisor 节点的状态进行负载均衡等)。 Nimbus节点上不能运行 Worker。

  • Supervisor 节点 :负责从 Zookeeper 上获取、启动并运行任务。

因此相对而言,我们认为 Nimbus 并不需要 Supervisor 节点那么高的配置,在我们的测试环境中, Nimbus 的硬件配置只有 Supervisor 节点的一半。 Storm UI 节点也不需要高配置可以和 Nimbus 节点在同一台机器上。

主机IP 节点
192.168.2.101 nimbus
192.168.2.102 supervisor
192.168.2.103 supervisor

二、部署 Storm 服务

在 Storm 官网上(http://storm.apache.org)下载安装包,下面以 Storm-1.2.1 为例安装 Storm 集群。

(1) Storm 安装

wget https://www.apache.org/dyn/closer.lua/storm/apache-storm-1.2.1/apache-storm-1.2.1.tar.gz
# 解压安装包
tar -zxvf apache-storm-1.2.1.tar.gz
cd /usr/local/lib/apache-storm-1.2.1
# 日志目录
mdkir data
ln -sv /usr/local/lib/apache-storm-1.2.1 /usr/local/storm

(2) Storm 基本配制

vim /usr/local/lib/apache-storm-1.2.1/conf/storm.yaml

# 注意 yaml 文件配制格式,参数前空格,: 后空格,- 后空格
# 配置 zookeeper 节点集群
storm.zookeeper.servers:
- "192.168.2.101"
- "192.168.2.102"
- "192.168.2.103"
# 配制 nimbus 进程所在的主机
nimbus.host: "192.168.2.101"
# Nimbus 和 Supervisor 后台进程都需要一个用于存放一些状态数据(比如 jar 包、配置文件等等)的目录
storm.local.dir: "/usr/local/lib/apache-storm-1.2.1/data"
# 配制 ui 进程的监听端口
ui.port: 8080
# 配制 supervisor 运行 worker 时可以使用的端口列表。
# 如果你在这里定义了 5 个端口,那么 Storm 就会在该机器上分配最多 5 个 worker
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
# 配制 DRPC 节点集群
drpc.servers:
- "localhost"
# 配置使用 Netty 作为消息传输,默认 ZeroMQ
storm.messaging.transport: "org.apache.storm.messaging.netty.Context"
storm.messaging.netty.server_worker_threads: 1
storm.messaging.netty.client_worker_threads: 1
storm.messaging.netty.buffer_size: 5242880
storm.messaging.netty.max_retries: 300
storm.messaging.netty.max_wait_ms: 1000
storm.messaging.netty.min_wait_ms: 100

(3) 环境变量

vim /etc/profile.d/start.sh

# storm
STORM_HOME=/usr/local/storm
export PATH=$PATH:$STORM_HOME/bin

(4) 启动 Storm

在 Storm 配置好了之后,可以启动 Storm 进程。

    Nimbus 进程启动:storm nimbus &
Supervisor 进程启动:storm supervisor &
UI 进程启动:storm ui &
Log Viewer 进程启动:storm logviewer &
DRPC 进程启动:storm drpc &

在 Storm Nimbus 节点上需要运行的进程为 Nimbus、UI 和 Log Viewer,在 Storm Supervosor 节点上需要运行的进程为 Supervisor 和 Log Viewer。访问 UI: http:localhost:8080

(5) 部署 Storm 的其他节点

当 Storm 的一个节点部署并配置完成后,其他节点可以完全直接复制,完成后直接运行。由此也可以看出, Storm 扩容时将会是非常方便的。因此对于我们要创建一个具有 3 个节点的 Storm 集群而言,直接将以上已经配置好的安装文件远程复制过去即可。

三、配置 Storm

Storm 的配置文件为 storm-0.9.0.l/conf/storm.yaml。在运行 Storm 进程之前,需要对该配置文件进行基本配置。表 3-1 列出了 Storm 中部分比较重要的配置信息。

  1. java.library.path :Storm 本身依赖包的路径,存在多个时用冒号分隔
  2. storm.local.dir :Storm 使用的本地文件系统目录(必须存在并且 Storm 进程可读写)
  3. storm.zookeeper.servers :Storm 集群对应的 Zookeeper 集群的主机列表
  4. storm.zookeeper.port :Storm 集群对应的 Zookeeper 集群的服务端口, ZooKeeper 默认端口为 2181
  5. storm.zookeeper.root :Storm 的元数据在 Zookeeper 中存储储的根目录
  6. storm.cluster.mode :Storm 运行模式,集群模式需设置为 distributed(分布式的)
  7. storm.messaging.transport :Storm 的消息传输机制,使用 Netty 作为消息传输时设置成 backtype storm.messaging.netty.Context
  8. nimbus.host :整个 Storm 集群的 Nimbus 节点
  9. nimbus.supervisor.timeout.secs :Storm 中每个被发射出去的消息处理的超时时间,该时间影响到消息的超时处理,同时在 Storm UI 上杀掉一个 Topology 时的默认时间(kill 动作发出后多长时间才会真正将该 Topology 杀掉)
  10. ui.port :Storm 自带 UI,以 HTTP 服务形式支持访问,此处设置该 HTTP 服务的端口(非 root 用户端口号需要大于 1024)
  11. ui.childopts :Storm UI 进程的 Java 参数设置(对 Java 进程的约束都可以在此设置,如内存等)
  12. logviewer.port :此处用于设置该 Log Viewer 进程的端口(Log Viewer 进程也为 HTT P形式,需要运行在每个 Storm 节点上)
  13. logviewer.childopts :Log Viewer 进程的参数设置
  14. logviewer.appender.name :Storm log4j 的 appender,设置的名字对应于文件 storm-0.9.0./logback/cluster.xml 中设置的 appender, cluster.xml 可以控制 Storm logger 的级别。
  15. supervisor.slots.ports :Storm 的 Slot,最好设置成 OS 核数的整数倍;同时由于 Storm 是基于内存的实时计算,Slot 数不要大于每台物理机可运行 Slot 个数:(物理内存一虚拟内存)/单个 Java 进程最大可占用内存数
  16. worker.childopts :Storm 的 Worker 进程的 Java 限制,有效地设置该参数能够在 Topology 异常时进行原因分析:

    -Xms1024m -Xmx1024m -XX: +UseConcMarkSweepGC

    -XX: +UseCMSInitiatingOccupancyOnly

    -XX: CMSInitiatingOccupancyFraction=0

    -XX: +HeapDumpOnOutOfMemoryError

    其中:Xms 为单个 Java 进程最小占用内存数,Xmx 为最大内存数。设置 HeapDumpOnOutOfMemoryError 的好处是,当内存使用量 Xmx 时,Java 进程将被 JVM 杀掉同时会生成 java_pidxxx.hprof 文件;使用 MemoryAnalyzer 分析 hprof 文件将能够分析出内存使用情况从而进行相应的调整、分析是否有内存溢出等情况
  17. zmq.threads :Storm 0.9.0.1 也支持基丁 ZMQ 的消息传递机制,此处为对 ZMQ 的参数设置;建议使用默认值
  18. storm.messaging.netty :传输的bufr大小,默认1MB,当 Spout发射的消息较大时
  19. buffer_size.netty 此处需要对应调整
  20. storm.messaging.netty.max_retries/storm.messaging.netty.max_wait/storm.messaging.netty.wait_ms :这几个参数是关于使用 Netty 作为底层消息传输时的相关设置,需要重视,否则可能由于 bug(https://issues.apache.org/jira/browse/STORN-187)而引起错误 java.lang.IllegalArgumentException: timeout value is negative
  21. Topology.debug :该参数可以在 Topology 中覆盖,表示该 Topology 是否运行于 debug 模式。运行于该模式时, Storm 将记录 Topology 中收发消息等的详细信息,线上环境不建议打开
  22. Topology.acker.executors :Storm 通过 Acker 机制保证消息的不丢失,此参数用于设置每个 Topology 的 Acker 数量,由于 Acker 基本消耗的资源较小,强烈建议将此参数设置在较低的水平(我们的环境中设置为1),可在 Topology 中进行覆盖
  23. Topology.max.spout.pending :一个 Spout Task 中处于 pending 状态的最大的 Tuple 数量。该配置应用于单个 Task,而不是整个 Spout 或 Topology,可在 Topology 中进行覆盖

需要注意的是, Storm 的配置文件为 yaml 文件,配置项后面必须跟一个空格才能跟配置值。

除了 conf/storm.yaml 配置文件之外,还有两个需要注意的配置

(1) logback/cluster.xml 文件,其中可以配置 Storm 的日志级别矩阵信息等。

(2) 操作系统的配置(通过 u1imit -a 查看),其中有两项信息需要配置。

  • open fi1es 当前用户可以打开的文件描述符数
  • max user processes 当前用户可以运行的进程数,此参数太小将引起 Storm 的一个错误。

Storm 的配制可以参考下面两篇文章:

  1. 官方翻译:http://ifeve.com/storm-setting-up-a-storm-cluster/
  2. Storm 的配制:https://blog.****.net/u010003835/article/details/52182244

四、Storm UI

Storm UI 分成 Cluster Summary、 Topology Summary、 Supervisor Summary、 Nimbus Configuration 四个部分。

  • Cluster Summary :介绍了整个集群的信息,其中列出了 Slot 的总数和使用情况,通过空闲 Slot(free slots)我们可以预估整个 Storm 的容量以确定集群的扩容等。

  • Topology Summary :介绍了整个 Storm 集群上面运行的 Topology 的情况,选择每个具体的 Topology,可以看到该 Topology 的所有 Spout、Bolt 及其统计信息

  • Supervisor Summary :介绍了整个 Storm 集群中的所有的 Supervisor 节点的状态,其中 Uptime 是 Supervisor 进程启动后到当前的运行时间

  • Nimbus Configuration :介绍了整个 Storm 集群的配置信息,由于所有的节点都采用了同样的配置,因此该配置信息实际上也是整个集群的配置,其中:

    • nimbus.thrift.port :该端口为 Thrift 服务端口,当需要对 UI 进行二次开发时,可以根据 thrift 通过该端口获取 Storm 的运行状态(Storm UI 就是通过该端口调用 Thrift 接口获取到整个 Storm 的运行状态的);
    • storm.messaging.transport :当其值为 backtype.storm.messaging.netty.context 时,表示整个 Storm 集群使用的是 Netty 的消息传输机制
    • worker.childopts :表示 Topology 分布到各个 Supervisor 节点上运行时的 JVM 参数。

在整个 Storm 的部署及使用过程中,需要注意以下两点。

  • 在 Storm 的根目录下,有一个lib 目录,里面是 Storm 本身依赖的 JAR 包;这里的所有 JAR 包会在 Storm Worker 进程启动时被加载,因此个人编写的 JAR 包不建议放在该目录下,以免包更新带来的不便。
  • 向 Storm 集群提交 Topology 时,建议将该 Topology 所有依赖的 JAR 包和业务源代码都打成一个 JAR 包,这样业务需要的 JAR 包都和 Topology 在同一个 JAR 包中,否则当 Topology 依赖的 JAR 包更新时需要将该更新包放到所有的 Storm 节点上,同时对于一个公共 Storm 集群而言,各应用依赖的 JAR 包将是互相独立的,不会造成混淆。

每天用心记录一点点。内容也许不重要,但习惯很重要!

本文来自 《Strom 技术内幕与大数据实践》 一书。