Hadoop如何使用Zookeeper来保障高可用?

问题描述

Hadoop 中有一个分布式调度框架 YARN,是很基础的重要框架,用来支持多种计算模型和进行资源调度。

先看下 YARN 的架构图

不需要了解这个架构的细节,只需要看到其中的一个重点:

中间的 ResourceManager 存在单点问题

从图中就可以看出 ResourceManager 的地位非常重要,负责集群中所有资源的管理分配,与其他部分进行沟通协作,所以,ResourceManager必须是高可用的。

解决方案

下图是官网上的架构图

可以看到,解决方案是:

active/standby模式 + zookeeper

active/standby模式 就是使用多个 ResourceManager,其中一个为 active激活 状态,其余的为 standby就绪状态,简单理解就是主备

这就涉及到两个问题:

  • 如何选主?

让哪个ResourceManageractive状态

  • 如何进行主备切换?

activeResourceManager坏掉后,standbyResourceManager怎么自动变为active

实现方式

  • 选主

所有 ResourceManager在启动时,都去 zookeeper 中创建一个临时节点,例如节点路径为 /YarnActiveResourceManager

zookeeper 可以保证只有一个能创建成功,那么成功的 ResourceManager就是 active,其余的为 standby

  • 主备切换

standbyResourceManager 都会对 /YarnActiveResourceManager这个节点注册一个事件监听。

/YarnActiveResourceManager被删除时,zookeeper 会通知这些 standbyResourceManager,他们立即执行选主动作,就是再次去创建节点 /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必须进行授权才能进行访问。

原文发布于微信公众号 - 性能与架构(yogoup)

原文发表时间:2016-11-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我爱编程

搭建Hadoop伪分布式环境

安装SSH: sudo yum install opensh-clients openssh-server 安装完成后,可以使用下面命令进行测试: ssh...

2873
来自专栏伦少的博客

spark-submit提交Spark Streamming+Kafka程序

2665
来自专栏Hadoop实操

0459-如何使用SQuirreL通过JDBC连接CDH的Hive(方式一)

SQuirreL SQL Client是一个使用Java写的访问各种数据库客户端工具,使用JDBC统一了数据库的访问接口,通过SQuirreL SQL Clie...

843
来自专栏Hadoop实操

如何启用Impala的动态资源池

在Cloudera Manager中动态资源池分为Yarn的动态资源池和Impala的动态资源池两种。Fayson在前面有多篇文章介绍了Yarn动态资源池的使用...

4414
来自专栏行者悟空

Hadoop 2.x 伪分布式环境搭建

1142
来自专栏分布式系统和大数据处理

配置Hadoop集群客户端

在Hadoop和Spark集群搭建好了以后,如果我们需要向集群中发送、获取文件,或者是执行MapReduce、Spark作业,通常是搭建一个外围的、集群的客户端...

1964
来自专栏行者悟空

Spark之集群概述

1483
来自专栏LuckQI

Java大数据学习~Hadoop初识二读取与写入流程

1305
来自专栏Hadoop实操

如何修改CDH集群的DataNoe节点HOSTNAME

在使用CDH集群的过程中,会涉及到修改集群DataNode的HOSTNAME,在修改HOSTSNAME的时候需要注意什么,如何让新修改HOSTSNAME的CDH...

5295
来自专栏Hadoop实操

如何在CDH集群外配置非Kerberos环境的Gateway节点

1754

扫码关注云+社区