Zookeeper分布式一致性原理(十一):Zookeeper在JStorm中应用

Storm 是Twitter开源的一个高容错的分布式实时计算系统,而JStorm是阿里巴巴集团中间件团队在Storm基础上改造和优化的一个分布式实时计算引擎,它使用Java语言开发。

JStorm是一个类似与Hadoop MapReduce的分布式计算系统,用户按照指定的接口编写一个任务程序,然后将这个任务程序提交给Jstorm系统,Jstorm系统会复杂7*24小时运行并调度该任务。在运行过程中如果某个任务执行器发生意外其他故障,调度器会立即分配一个新的Worker替换这个失效的Worker来继续执行任务。

JStorm 整体架构图:
在这里插入图片描述

其核心部分由Nimbus、Supervisor、Worker、Task和Zookeeper五部分组成

  • Nimbus:是任务的中央调度器
  • Supervisor:做为Worker的代理角色,负责管理Worker的生命周期。
  • Worker: 是Task的容器
  • Task:对应每一个任务的真正执行体
  • Zookeeper:是整个系统的协调者

无论Storm还是JStorm,都高度依赖Zookeeper来实现诸如同步心跳。

1. 同步心跳

在JStorm中,需要集群内部实时同步三种心态;

Worker向Supervisor汇报心跳
Supervisor向Nimbus汇报心跳
Task向Nimbus汇报心跳

其中后面两种心跳检测机制通过Zookeeper来实现。

在JStorm实现中,Supervisor每隔10s就将字节拥有的资源数量同步到Zookeeper的/supervisor节点上,Nimbus就可以通过这些节点来检查由哪些集群式或者的。

而每个Task每隔10s就会将自己的心跳和运行状态同步到Zookeeper的/tasks节点上,这样Nimbus就能够检查到哪些task是活着的。同时一旦检查到某个Task的心跳超时,则会触发Nimbus对该Task执行Rassign动作(重新分配任务)。

2. 同步任务配置

JStorm来负责运行并调度该任务,因此同步任务配置是JStorm的一大核心功能。整个同步任务配置过程大体上可以分为提交任务和同步Topology状态两大环节。

2.1 提交任务

提交任务的过程如下:

  1. 客户但提交提交一个Jar到Nimbus
  2. Nimbus扫描Zookeeper上的/supervisor节点,获取本集群中所有的资源信息。
  3. Nimbus扫描Zookeeper上的/assignments节点,来获取分配的任务的资源占用情况。
  4. Nimbus根据平衡算法,将Task分配到每一个机器上,同时确定Task绑定的端口和资源调度情况(CPU Slot、Memory Slot、Disk Slot)
  5. 完成分配任务之后,Nimbus会将任务的分配结果写入Zookeeper的/assignmetns节点中
  6. Nimbus还需要设置Topology的状态为Active,做法就是在Zookeeper上的/topology节点下找到以该Topology的topology-id命名的对应子节点,并将其设置为Active
  7. 重新分配任务。每个Supervisor都会监听/Zookeeper上的/assignmetns节点。当检测到节点发生变更时,就会立即获得本机的任务配置,然后启动或者杀死对应的Worker。

2.2 同步Topology状态

JStorm提供了一系列的命令来控制Storm的服务,这里以客户端的deactivate命令为例来说明JStorm是如何借助Zookeeper来同步Topology状态的。

  1. 客户端发出deactive命令
  2. Nimbus收到这个命令之后,会设置Zookeeper中的/StomrBase节点对应的Topology状态为deactive
  3. 同时Worker进程会对Zookeeper中的/StormBase节点进行注册监听,当节点发生变化之后,立即设置Worker的状态为deactive
  4. Worker内部的Task每执行一个batch操作后,就会检查Worker状态,如果状态变更为deactive,那么Task就会立即将自己设置为挂起状态。

2.3 调度器选举

JStorm增加了调度器的HA机制,用于实现调度器的动态选举。每个Nimbus在启动的时候,都会试图到Zookeeper上创建一个临时节点/nimbus_master。在创建这个过程中,如果发现该节点以及存在,则表示Nimbus的Master已经存在,那么当前Nimbus就会在Zookeeper的/nimbus_slave节点下创建一个临时子节点,并将自己的机器名和端口号写入到该节点中,同时注册对/nimbus_master的监听。

在运行过程过程中,该Nimbus(这里指的是创建/nimbus_slave节点对应的机器)还会启动一个Follower线程,用于:

  1. 反复扫描/nimbus_master是否存在
  2. 如果/nimbus_master节点存在,则同步/nimbus_master的Topology到本机中
  3. 如果/nimbus_master节点消失,则会触发调度器的重新选举。

3. Zookeeper使用优化

3.1 减少Zookeeper的全量扫描

3.2 减少无用的Watcher操作

3.3 延长心跳设置

猜你喜欢

转载自blog.csdn.net/qq_21125183/article/details/86561826