Hadoop如何使用Zookeeper来保障高可用?
问题描述
Hadoop 中有一个分布式调度框架 YARN,是很基础的重要框架,用来支持多种计算模型和进行资源调度。
先看下 YARN 的架构图
不需要了解这个架构的细节,只需要看到其中的一个重点:
中间的 ResourceManager 存在单点问题。
从图中就可以看出 ResourceManager 的地位非常重要,负责集群中所有资源的管理分配,与其他部分进行沟通协作,所以,ResourceManager必须是高可用的。
解决方案
下图是官网上的架构图
可以看到,解决方案是:
active/standby模式 + zookeeper
active/standby模式 就是使用多个 ResourceManager,其中一个为 active激活 状态,其余的为 standby就绪状态,简单理解就是主备。
这就涉及到两个问题:
- 如何选主?
让哪个ResourceManager为active状态
- 如何进行主备切换?
当active的ResourceManager坏掉后,standby的ResourceManager怎么自动变为active
实现方式
- 选主
所有 ResourceManager在启动时,都去 zookeeper 中创建一个临时节点,例如节点路径为 /YarnActiveResourceManager
。
zookeeper 可以保证只有一个能创建成功,那么成功的 ResourceManager就是 active,其余的为 standby。
- 主备切换
standby 的 ResourceManager 都会对 /YarnActiveResourceManager
这个节点注册一个事件监听。
当 /YarnActiveResourceManager
被删除时,zookeeper 会通知这些 standby 的 ResourceManager,他们立即执行选主动作,就是再次去创建节点 /YarnActiveResourceManager
,这样就会产生一个新的 active,完成主备切换。
主ResourceManager 坏掉时,/YarnActiveResourceManager
这个节点就会自动被删除,因为当时创建的是临时节点,zookeeper 可以保证临时节点与创建者共存亡。
假死问题
当 主ResourceManager工作量太大,不堪重负时,可能会出现假死的现象,而这时zookeeper会认为他已经挂掉了,但实际上他只是忙晕了。
zookeeper发现 主ResourceManager 挂掉后,就会删除其对应的临时节点 /YarnActiveResourceManager
,那些 standby的ResourceManager 会立即进行选主,选出一个新的 主ResourceManager。
当前任 主ResourceManager 缓过来之后,问题就产生了,他认为自己还是主,去进行数据修改等操作,这就发生了冲突,有两个 主ResourceManager 在同时工作。
解决方式
需要用到 zookeeper 数据节点的 ACL 权限控制机制。
在创建 /YarnActiveResourceManager
节点时,必须携带权限信息(如用户名密码),只有创建者能够访问这个节点,相当于加了一把锁。
这样,假死后复生的那个 ResourceManager 会发现锁被换掉了,就知道有了新的 主ResourceManager,自动切换为 standby 状态。
小结
用到的zookeeper主要特性:
- 节点唯一
多个client竞相创建相同路径的节点时,只有一个client能成功。
- 临时节点
client创建节点时,如果指定节点的类型为临时节点,那么此节点的生命周期就是当前的会话,如果client挂了,与zookeeper的连接会话就结束了,此节点便被自动删除。
- Watcher
client可以对目标节点进行监听,例如监听此节点的状态变化,那么当节点被删除时,client就会收到zookeeper的事件通知,触发client的相应动作。
- 节点权限
client创建节点时可以指定权限信息,例如限定可以访问的IP、用户名密码,其他client必须进行授权才能进行访问。
- 05:登月计划
- PySide——Python图形化界面入门教程(二)
- PySide——Python图形化界面入门教程(三)
- 用代码生成Glitch Art风格的抖音字体
- PySide——Python图形化界面入门教程(四)
- PySide——Python图形化界面入门教程(五)
- PySide——Python图形化界面入门教程(六)
- Python写的嗅探器——Pyside,Scapy
- 使用sklearn构建含有标量属性的决策树
- 利用Python sklearn的SVM对AT&T人脸数据进行人脸识别
- C/C++网络编程时注意的问题小结
- PHP防止SQL注入的方法
- HTML5离线缓存攻击测试
- IE的BHO通过IHTMLDocument2接口获得网页源代码
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- redis 入门(一)——Linux环境安装测试以及基本命令演示
- 大型项目技术栈第五讲 富文本编辑器
- weblogic 11g StuckThreadMaxTime 问题解决 以及 线程池、数据库连接池参数调优
- 大型项目技术栈第九讲 kaptcha的使用
- 大型项目技术栈第十讲 日志与性能监控
- Mybatis系列第三讲 Mybatis使用详解(1)
- Maven系列第二讲 安装、配置、mvn运行过程详解
- Maven第六讲 生命周期详解 高手必备!
- 鸿蒙 Ability 讲解(页面生命周期、后台服务、数据访问)
- Maven 项目第七讲 Maven插件
- weblogic Schema validation schemaValidationEnabled=false 启动报错解决
- redis 反序列化deserialize异常问题解决
- redis 入门(二)——maven4.0 + Jedis2.9.0 + redis3.2.6 实战
- spring boot 启动报错Log4j2 could not find a logging implementation 解决
- spring boot 启动 NoClassDefFoundError: org/springframework/core/ErrorCoded 报错