文档章节

Storm nimbus HA

Adel
 Adel
发布于 2016/04/11 11:13
字数 1742
阅读 669
收藏 2

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

一、storm组件

Storm在集群上运行一个Topology时,主要通过以下3个实体来完成Topology的执行工作:
1. Worker(进程)
2. Executor(线程)
3. Task
下图简要描述了这3者之间的关系:


1个worker进程执行的是1个topology的子集(注:不会出现1个worker为多个topology服务)。1个worker进程会启动1个或多个executor线程来执行1个topology的component(spout或bolt)。因此,1个运行中的topology就是由集群中多台物理机上的多个worker进程组成的。
executor是1个被worker进程启动的单独线程。每个executor只会运行1个topology的1个component(spout或bolt)的task(注:task可以是1个或多个,storm默认是1个component只生成1个task,executor线程里会在每次循环里顺序调用所有task实例)。
task是最终运行spout或bolt中代码的单元(注:1个task即为spout或bolt的1个实例,executor线程在执行期间会调用该task的nextTuple或execute方法)。topology启动后,1个component(spout或bolt)的task数目是固定不变的,但该component使用的executor线程数可以动态调整(例如:1个executor线程可以执行该component的1个或多个task实例)。这意味着,对于1个component存在这样的条件:#threads<=#tasks(即:线程数小于等于task数目)。默认情况下task的数目等于executor线程数目,即1个executor线程只运行1个task。

二、Storm nimbus单点问题

1、storm集群在生产环境部署之后,通常会是如下的结构:


从图中可以看出zookeeper和supervisor都是多节点,任意1个zookeeper节点宕机或supervisor节点宕机均不会对系统整体运行造成影响,但nimbus和ui都是单节点。ui的单节点对系统的稳定运行没有影响,仅提供storm-ui页面展示统计信息。但nimbus承载了集群的许多工作,如果nimbus单节点宕机,将会使系统整体的稳定运行造成极大风险。因此解决nimbus的单点问题,将会更加完善storm集群的稳定性。

2、storm nimbus单节点的风险
(1)功能上,nimbus进程退出后,如果再同时发生worker进程宕机,宕机的worker将无法重启,集群将会有部分消息始终无法得到处理。
(2)监控上,nimbus进程不可用时,storm ui将无法访问。
(3)几率上,机房由于演练或故障不可用时即会出现nimbus与worker进程同时故障的情形,面对风险的几率较大。

3、storm与解决nimbus单点相关的概念

【nimbus进程】storm集群工作的全局指挥官。
(1)通过thrift接口,监听并接收client对topology的submit,将topology代码保存到本地目录/nimbus/stormdist/下
(2)为client提交的topology计算任务分配,根据集群worker资源情况,计算出topology的spout和bolt的task应该如何在worker间分配,任务分配结果写入zookeeper
(3)通过thrift接口,监听supervisor的下载topology代码的请求,并提供下载
(4)通过thrift接口,监听ui对统计信息的读取,从zookeeper上读取统计信息,返回给ui
(5)若进程退出后,立即在本机重启,则不影响集群运行。

【supervisor进程】storm集群的资源管理者,按需启动worker进程。
(1)定时从zookeeper检查是否有代码未下载到本地的新topology,定时删除旧topology代码
(2)根据nimbus的任务分配结果,在本机按需启动1个或多个worker进程,监控守护所有的worker进程。
(3)若进程退出,立即在本机重启,则不影响集群运行。

【worker进程】storm集群的任务构造者,构造spout或bolt的task实例,启动executor线程。
(1)根据zookeeper上分配的task,在本进程中启动1个或多个executor线程,将构造好的task实例交给executor去运行(死循环调用spout.nextTuple()或bolt.execute()方法)。
(2)向zookeeper写入心跳
(3)维持传输队列,发送tuple到其他的worker
(4)若进程退出,立即在本机重启,则不影响集群运行。

【executor线程】storm集群的任务执行者,循环执行task代码。
(1)执行1个或多个task(每个task对应spout或bolt的1个并行度),将输出加入到worker里的tuple队列
(2)执行storm内部线程acker,负责发送消息处理状态给对应spoult所在的worker


nimbus目前无法做到多节点的原因

1、nimbus节点的ip地址在配置文件中storm.yaml,更换机器后ip地址变化,需要更新集群所有节点的配置文件后重启集群。
2、客户端submitTopology时也需要取得nimbus ip上传代码。nimbus更换机器后,client也需要修改配置文件。
3、nimbus机器的本地硬盘存放了topology的代码,更换机器后代码全部丢失,新启动的supervisor将无法下载正在运行的topology代码。
4、storm ui是从nimbus读取集群统计信息的,nimbus更换机器后ui也需要修改配置文件后重启。
5、同时启动多个nimbus节点,会面临多个nimbus并发计算topology的任务分配,并发写入zookeeper,并发清理zookeeper等诸多不可预料的问题。即使存在多个nimbus节点,storm-ui、supervisor、client等也只会使用配置文件指定的ip的节点。

三、nimbus HA 的解决方案

目前topology的jar包保存在nimbus节点的本地存储上,为了解决ha的问题,需要提供一种存储在分布式并且可靠的方式。DFS是一种完美的解决方案,但是,这不应该是一种强制的使用方式,应该提供可选的可插拔的(默认为本地文件系统,但是界面应该支持DFS)。如果你选择本地存储的方式且尝试运行多个nimbus,那么其中一个nimbus应该睡启动失败。


Nimbus应该在zookeeper中进行注册,然后使用leader election protocol来决定哪个nimbus负责启动和监控topology。


StormSubmitter应该通过zookeeper找到需要连接的nimbus,如果在提交任务期间,leader发生改变,他应该使用retry protocol去尝试连接新的leader并再次尝试提交任务。

下图展示了nimbus ha topology作业提交序列图

nimbus_ha_topology_submission


leader选举不必多说,基于Zookeeper curator recipes。我们主要关注下代码分发,基本流程:

  1. leader nimbus通过CodeDistributor上传代码并获得MetaFile,然后在Zookeeper创建标记;

  2. 非leader nimbus watch到Zookeeper上的变化,从leader获得MetaFile,然后根据MetaFile的描述从CodeDistributor下载代码。

目前storm1.0.0版本已经将nimbus ha加入。

© 著作权归作者所有

Adel
粉丝 10
博文 71
码字总数 61751
作品 0
海淀
程序员
私信 提问
Apache Storm简介及安装部署

Apache Storm是一个分布式的、可靠的、容错的实时数据流处理框架。它与Spark Streaming的最大区别在于它是逐个处理流式数据事件,而Spark Streaming是微批次处理,因此,它比Spark Streaming...

风火数据
2018/07/20
0
0
storm启动卡着不动,求高手

刚把storm集群部好,结果启动时卡着不动。 执行:./storm nimbus 提示: [root@WY_CentOS_100G bin]# ./storm nimbus Running: java -server -Dstorm.options= -Dstorm.home=/usr/local/src......

lja
2013/07/11
2.2K
1
storm/jstorm 相关命令

1.启动nimbus,进程名为nimbus nohup storm nimbus & 2.启动supervisor,进程名为supervisor nohup storm supervisor & 3.启动ui,进程名为core nohup storm ui & 4.启动log nohup storm log......

cjun1990
2015/01/06
1K
0
【Storm】Storm简介及Storm集群的安装部署

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/gongxifacai_believe/article/details/86557602 1、Storm概述 (1)Storm简介 Storm最早是由BackType公司开发的实时...

魏晓蕾
01/20
0
0
聊聊storm nimbus的LeaderElector

序 本文主要研究一下storm nimbus的LeaderElector Nimbus org/apache/storm/daemon/nimbus/Nimbus.java Nimbus在构造器里头调用Zookeeper.zkLeaderElector创建leaderElector launchServer方法......

go4it
2018/10/10
122
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么面试必问线程状态?你的回答满分了吗

看很多同学的面经、网上的面试资料,都不约而同的提到了一个基础问题:“你知道线程有几种状态吗?状态之间的扭转是怎样的?”,有准备的同学都知道有五种:New(新建)、Runnable(可运行)...

Z_J_H
27分钟前
4
0
如何保障云上数据安全?一文详解云原生全链路加密

点击下载《不一样的 双11 技术:阿里巴巴经济体云原生实践》 本文节选自《不一样的 双11 技术:阿里巴巴经济体云原生实践》一书,点击上方图片即可下载! 作者 李鹏(壮怀)阿里云容器服务高...

阿里巴巴云原生
27分钟前
3
0
获取数组的第一个元素

我有一个数组: array( 4 => 'apple', 7 => 'orange', 13 => 'plum' ) 我想获得此数组的第一个元素。 apple 预期结果: apple 一个要求: 它不能通过引用传递来完成 ,所以array_shift不是一......

javail
29分钟前
4
0
哈希情史知多少

<p align="right">——日拱一卒,不期而至!</p> 简介 hash是我们工作中经常听到的词,比如哈希表、哈希函数、hashCode、HashTable、HashMap等等,那么它们之间到底有怎样的爱恨情仇呢?来一...

彤哥读源码
35分钟前
4
0
SpringCloud 学习(5) --- Zuul(一)基本概念、配置

[TOC] Spring Cloud eureka:注册中心 服务端:提供注册 客户端:进行注册 ribbon:负载均衡(集群) Hystrix:熔断器,执行备选方案 Feign:远程调用 Zuul:网关,统一入口。 1.1、一夫当关,...

庭前云落
38分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部