码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-04-09 00:22:23      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:read   多个   除了   工作   信息   业务   性能   错误   集群   

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

本章中主要介绍了 Storm 的部署过程以及相关的配置信息。通过本章内容,帮助读者从零开始搭建一个 Storm 集群。相关的过程和主要的配置选项是 Storm 的运维人员需要重点关注的,对部署和配置选项不感兴趣的读者,可以跳过本章。

在开始 Storm 之旅前,我们先看一下 Storm 部署和配置的相关信息,并提交一个 Topology,了解 Storm 的基本原理。Storm 的部署模式包括单机和集群环境,同时在向 Storm 环境中提交 Topology 时,可以提交为本地(LocalCluster)或集群模式。 Storm 上应用的第一编程语言是 Java,通过 Storm 的本地集群模式, Topology 可以在 Eclipse 中直接运行、调试,因此关于 Storm 的部署这里只涉及本地和集群模式。

在本地模式中, Storm 会在进程中模拟 Storm 集群的功能,编写的 Topology 代码无需提交可以直接在本地运行,这对于开发和测试 Topology,非常有好处。

3.1 Storm 的依赖组件

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

  1. JDK :可以到到 Oracle 官网下载并部署,设置环境变量(JAVA_HOME、PATH 和 CLASSPATH)并使之生效。
  2. Zookeeper :Storm 本身重度依赖于 Zookeeper,同时在我们线上的环境中还有其他依赖于 ZooKeeper 的服务,因此单独部署一个专门用于流式计算的 Zookeeper 是非常有必要的。
  3. Storm :Storm 可以从其官方地址(http://storm.apache.org/)下载。

若部署 0.9 版本之前的 Storm,还需要安装 ZMQ 和 JZMQ(除非作为研究之用,否则不推荐)。 Storm 在 0.9 之前使用的消息传输机制是 ZMQ,从 0.9 开始引入 Nety(也还支持 ZMQ)。相比 ZMQ 的 C 实现,纯 Java 实现的 Netty 能够提供更好的性能和可管理性(ZMQ 不能通过 -Xmx 等对内存进行管理)。

在 Yahoo! 中运行着一个超过 250 个节点的 Storm 集群,雅虎改进了 Storm 对 Zookeeper 的依赖,使得 0.9.2 版本时一个 Zookeeper 集群已经能够支持 2000 个节点,而他们的目标是到 2015 年一个 Storm 集群支持超过 4000 个节点。

3.2 Storm 的部署环境

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

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

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

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

3.3 部署 Storm 服务

以下简要介绍一下 Storm 的部署

3.3.1 部署 ZooKeeper

在我们編写本书时, Zookeeper 最新稳定版本已经是 3.4.6,鉴于我们的环境上运行的是 3.4.5 且该版本在生产环境中已经稳定运行较长时间,因此本书是基于 3.4.5 版本(在部署上 3.4.5 版本和 3.4.6 版本并没有任何的不同之处)。 Zookeeper 的部署可以参考 http://www.cnblogs.com/binarylei/p/8721129.html

从版本 3.4.0 开始, Zookeeper 提供了自动清理快照(snapshot)和事务日志的功能,需要 在zoo.cfg 配置文件中设置。

autopurge.purgeInterval=1
autopurge.snapRetainCount=3
  • autopurge.purgeInterval :这个参数指定了持久化日志清理频率,单位是小时,默认是 0,表示不开启自动清理功能。
  • autopurge.snapRetainCount :这个参数和上面的参数搭配使用,用于指定需要保留的持久化目志文件数目,默认是保留 3 个。

值得注意的是, Zookeeper 推荐部署奇数台服务器(根据据 Zookeeper 的特性,2N+1 台的 Zookeeper 集群,当 N 个节点不能访问时,整个 ZooKeeper 仍然是可用的)。

3.3.2 部署 Storm

在 Storm 官网上(http://storm.apache.org)可以获取到 Storm 的最新和最近几个版本。

在编写本书时, Storm 最新稳定版本已经是 0.9.3,鉴于在我们的环境中使用的是 Storm 0.9.0.1 版本且该版本经过一些参数调整后已经稳定运行,本节中使用的仍旧是 0.9.0.1。

Storm 可以下载编译好的版本并在下载完成后将其放入安装路径中。我们习惯于新建个路径用于安装所有流计算相关的组件(如 Flume、 Kafka、 Zookeeper、 Storm 等),例如:

# 将 Storm 安装文件移动到安装路径下
mv storm-0.9.0.1.tar.gz /home/storm/
# 解压安装包
tar zxvf storm-0.9.0.1.tar.gz

3.3.3 配置 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 的一个错误。

3.4 启动 Storm

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

  • 启动 Nimbus 进程:storm nimbus
  • 启动 Supervisor 进程:storm supervisor
  • 启动 UI 进程:storm ui
  • 启动 Log Viewer 进程:storm logviewer

在 Storm Nimbus 节点上需要运行的进程为 Nimbus、UI 和 Log Viewer,在 Storm Supervosor 节点上需要运行的进程为 Supervisor 和 Log Viewer。

3.5 Storm 的守护进程

理论上, Storm 的相关进程启动后就可以进行提交 Topology 等操作了。唯一需要注意的是,以上启动 Storm 进程命令在 SSH 退出后也将导致 Storm 相关进程结束,因此我们需要使得 Storm 相关进程在后台运行。

由于 Storm 被设计成高容错,即当 Supervisor 进程因异常退出时,上面运行的 Worker 进程不受影响仍能正常工作作(虽然不能再启动新的 Worker 进程了),因此需需要给 Storm 编写一个守护进程,用于守护 Storm 的正常运行。

我们使用了 Storm 的守护进程 stormDaemon 实现了以下几个功能。

(1) 根据 /etc/sysconfig/network 中的主机名,每隔 5 秒守护 Storm 进程,当发现其不存在时启动对应的进程(作为 Nimbus 节点的主机,其 hostname 上会包含 Nimbus 的字符串,而作为 Supervisor 节点的主机,其 hostname 上会包含 Supervisor 的字符串)。

(2) 将该服务注册成 Linux 服务,使得 Linux 服务器重启后不需要人工干预即可正常启动 Storm 服务(通过 chkconfig--add)

(3) 当 Supervisor 节点因为某些原因启动不起来,需要重建 logs 目录以及 storm.local.dir 目录时,能够自动实现

(4) Storm 异常退出时,可以调用 sendmail 自动提醒 Storm 集群的 owner 对集群进行日常维护等

(5) 在 Nimbus 节点上运行 Nimbus 相关进程,在 Supervisor 节点上运行 Supervisor 进程

(6) 为方便系统的运维,该脚本既能仅仅单纯启停 Storm 进程,也能守护 Storm 进程;该脚本仅仅启停 Storm 的 Nimbus、 Supervisor、UI、 Log Viewer 进程,对已经在运行的 Worker 进程不做任何限制。

实现以上功能的守护进程的脚本可以参考 https://github.com/jeremychen/StormDeamon ,该脚本的运行如图 3-3 所示。

可以按照以下步骤部署该脚本。

(1) 将该脚本置于系统 init 目录下:/etc/init

(2) 增加一个 Linux 服务

chkconfig --add stormDaemon

(3) 检查该守护进程服务是否成功添加到系统启动项中。

chkconfig --list | grep stormDaemon

3.6 部署 Storm 的其他节点

当 Storm 的一个节点部署并配置完成后,其他节点可以完全直接复制,完成后直接运行。由此也可以看出, Storm 扩容时将会是非常方便的。因此对于我们要创建一个具有 6 个节点的 Storm 集群而言,直接将以上已经配置好的安装文件远程复制过去即可。需要注意的是,JDK 环境变量需要设置好, storm.yaml 配置文件中配置的路径(storm.1ocal.dir、java.library.path 等)需要预先创建并具有对应的权限。其他节点的部署在此不再赘述。

3.7 提交 Topology

Storm 提供了一个示例工程 storm-starter,以便用户更好地理解 Storm 的机制,更容易、快速地入门。该工程可以从 https://github.com/nathanmarz/storm-starter 获取。

在获得该示例代码后,通过 Maven 编译成 JAR 包,在 Nimbus 节点上提交应用即可在 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 技术内幕与大数据实践》 一书。

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

标签:read   多个   除了   工作   信息   业务   性能   错误   集群   

原文地址:https://www.cnblogs.com/binarylei/p/8747925.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!