Storm 系列(三)Storm 集群部署和配置
Storm 系列(二)Storm 集群部署和配置
本章中主要介绍了 Storm 的部署过程以及相关的配置信息。通过本章内容,帮助读者从零开始搭建一个 Storm 集群。
一、Storm 的依赖组件
1.1 要部署 Storm,需要要部署以下几个相关组件。
- JDK :从 Oracle 官网下载,设置环境变量(JAVA_HOME、PATH 和 CLASSPATH)。
- Zookeeper :安装详见(http://www.cnblogs.com/binarylei/p/8721129.html),Storm 本身重度依赖于 Zookeeper。
- Python :安装详见(http://www.cnblogs.com/binarylei/p/8792902.html),Linux 一般自带 Python。
- 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 中部分比较重要的配置信息。
- java.library.path :Storm 本身依赖包的路径,存在多个时用冒号分隔
- storm.local.dir :Storm 使用的本地文件系统目录(必须存在并且 Storm 进程可读写)
- storm.zookeeper.servers :Storm 集群对应的 Zookeeper 集群的主机列表
- storm.zookeeper.port :Storm 集群对应的 Zookeeper 集群的服务端口, ZooKeeper 默认端口为 2181
- storm.zookeeper.root :Storm 的元数据在 Zookeeper 中存储储的根目录
- storm.cluster.mode :Storm 运行模式,集群模式需设置为 distributed(分布式的)
- storm.messaging.transport :Storm 的消息传输机制,使用 Netty 作为消息传输时设置成 backtype storm.messaging.netty.Context
- nimbus.host :整个 Storm 集群的 Nimbus 节点
- nimbus.supervisor.timeout.secs :Storm 中每个被发射出去的消息处理的超时时间,该时间影响到消息的超时处理,同时在 Storm UI 上杀掉一个 Topology 时的默认时间(kill 动作发出后多长时间才会真正将该 Topology 杀掉)
- ui.port :Storm 自带 UI,以 HTTP 服务形式支持访问,此处设置该 HTTP 服务的端口(非 root 用户端口号需要大于 1024)
- ui.childopts :Storm UI 进程的 Java 参数设置(对 Java 进程的约束都可以在此设置,如内存等)
- logviewer.port :此处用于设置该 Log Viewer 进程的端口(Log Viewer 进程也为 HTT P形式,需要运行在每个 Storm 节点上)
- logviewer.childopts :Log Viewer 进程的参数设置
- logviewer.appender.name :Storm log4j 的 appender,设置的名字对应于文件 storm-0.9.0./logback/cluster.xml 中设置的 appender, cluster.xml 可以控制 Storm logger 的级别。
- supervisor.slots.ports :Storm 的 Slot,最好设置成 OS 核数的整数倍;同时由于 Storm 是基于内存的实时计算,Slot 数不要大于每台物理机可运行 Slot 个数:(物理内存一虚拟内存)/单个 Java 进程最大可占用内存数
- 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 文件将能够分析出内存使用情况从而进行相应的调整、分析是否有内存溢出等情况 - zmq.threads :Storm 0.9.0.1 也支持基丁 ZMQ 的消息传递机制,此处为对 ZMQ 的参数设置;建议使用默认值
- storm.messaging.netty :传输的bufr大小,默认1MB,当 Spout发射的消息较大时
- buffer_size.netty 此处需要对应调整
- 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
- Topology.debug :该参数可以在 Topology 中覆盖,表示该 Topology 是否运行于 debug 模式。运行于该模式时, Storm 将记录 Topology 中收发消息等的详细信息,线上环境不建议打开
- Topology.acker.executors :Storm 通过 Acker 机制保证消息的不丢失,此参数用于设置每个 Topology 的 Acker 数量,由于 Acker 基本消耗的资源较小,强烈建议将此参数设置在较低的水平(我们的环境中设置为1),可在 Topology 中进行覆盖
- 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 的配制可以参考下面两篇文章:
- 官方翻译:http://ifeve.com/storm-setting-up-a-storm-cluster/
- Storm 的配制:https://blog.csdn.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 技术内幕与大数据实践》 一书。
Storm 系列(三)Storm 集群部署和配置的更多相关文章
- ElasticSearch 深入理解 三:集群部署设计
ElasticSearch 深入理解 三:集群部署设计 ElasticSearch从名字中也可以知道,它的Elastic跟Search是同等重要的,甚至以Elastic为主要导向. Elastic即可 ...
- Zookeeper集群部署与配置(三)
在上一篇博客中我们讲解了<Zookeeper的单机配置>,此篇博客将继续介绍Zookeeper的集群部署与配置. 环境 集群配置的环境与单机配置的环境相同,唯一不同的就是集群是在多台服务器 ...
- (视频)asp.net core系列之k8s集群部署视频
0.前言 应许多网友的要求,特此录制一下k8s集群部署的视频.在录制完成后发现视频的声音存在一点瑕疵,不过不影响大家的观感. 一.视频说明 1.视频地址: 如果有不懂,或者有疑问的欢迎留言.视频分为两 ...
- 菜鸟系列k8s——k8s集群部署(2)
k8s集群部署 1. 角色分配 角色 IP 安装组件 k8s-master 10.0.0.170 kube-apiserver,kube-controller-manager,kube-schedul ...
- 理解 OpenStack + Ceph (1):Ceph + OpenStack 集群部署和配置
本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...
- Redis cluster 集群部署和配置
目录 一.集群简介 cluster介绍 cluster原理 cluster特点 应用场景 二.集群部署 环境介绍 节点部署 启动集群 三.集群测试 一.集群简介 cluster介绍 redis clu ...
- storm集群部署和配置过程详解
先整体介绍一下搭建storm集群的步骤: 设置zookeeper集群 安装依赖到所有nimbus和worker节点 下载并解压storm发布版本到所有nimbus和worker节点 配置storm ...
- Dubbo源码学习总结系列三 dubbo-cluster集群模块
Dubbo集群模块的目的是将集群Invokers构造一个透明的Invoker对象,其中包含了容错机制.负载均衡.目录服务(服务地址集合).路由机制等,为RPC层提供高可用.高并发.自动发现.可治理的S ...
- rabbitmq集群部署及配置
消息中间件rabbitmq,一般以集群方式部署,主要提供消息的接受和发送,实现各微服务之间的消息异步.本篇将以rabbitmq+HA方式进行部署. 一.原理介绍 rabbitmq是依据erlang的分 ...
随机推荐
- PHP写日志公共类
Txl_Log.php <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * * * ...
- 隐藏bat脚本运行时弹出的黑窗口,以隐藏进程在后台执行.
1.把这段代码写在前面@echo offif "%1"=="r" goto startif "%1"=="h" goto ...
- leetcode500
public class Solution { public string[] FindWords(string[] words) { var list1 = new List<char> ...
- 12.使用default-Action配置统一访问
转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html default-action-ref,当访问没有找到对应的action时,默 ...
- 1.Log4j入门
转自:https://blog.csdn.net/luohai859/article/details/52250807 日志是应用软件中不可缺少的部分, .Apache的开源项目log4j是一个功能强 ...
- django celery 定时任务
可参考上一篇:http://www.cnblogs.com/wumingxiaoyao/p/8515075.html 1. 安装 django-celery-beat pip3 install dja ...
- DataSnap Server HTTP json格式修改 返回图片
DataSnap Server HTTP json 格式修改 http://127.0.0.1:8080/datasnap/rest/TServerMethods1/EchoString/hello ...
- 怎样把代码复制到word中并保持颜色
- css兼容性记录
* , ie6,ie7可以识别: _和- , ie6可以识别: !important ,表示高优先级,ie7及以上,firefox都支持,ie6认识带!important的样式属性, ...
- python 冷知识点
# int could accept parameters in bool type.int(True) # result is 1 int(False) # result is 0 reprlib. ...