大数据面试 | 02 HDFS难点---HDFS 联邦和HDFS HA

目录

HDFS F

HDFS HA

为了解决HDFS1.0 中单点故障问题和内存受问题。提出了HDFS HA 和HDFS F。

解决单点故障问题:
  • HDFS HA: 通过NameNode 解决
  • 如果 NameNode 发生故障,就切换到备用NameNode
解决内存受限问题:
  • HDFS Federation
  • 水平扩展,支持多个NameNode
  • 所有的NameNode 共享所有的DataNode存储资源
  • 每一个NameNode 分管一部分目录

1. HDFS F

联邦 HDFS 是 namenode 水平扩展方案。联邦 HDFS 允许每个 namenode之间的命名空间相互独立。数据块池不再切分,所以每个DataNode 需要注册到每个 namenode。

HDFS 的底层存储是可以水平拓展的(底层存储指的是 datanode,当集群存储 空间不够时,可简单的添加机器以进行水平拓展),但 namespace 不可以。 当前的 namespace 只能存放在单个 namenode 上,而 namenode 在内存中存储了整个分布式文件系统中的元数据信息,这限制了集群中数据块,文件和目录的数目。

1.多个 NN 共用一个集群 DN 的存储资源,每个 NN 都可以单独对外供服 务。
2.每个 NN 都会定义一个存储池,有单独的 id,每个 DN 都为所有存储池供 存储。
3.DN 会按照存储池 id 向其对应的 NN 汇报块信息,同时,DN 会向所有 NN 汇 报本地存储可用资源情况。
4.如果需要在客户端方便的访问若干个 NN 上的资源,可以使用客户端挂载 表,把不同的目录映射到不同的 NN,但 NN 上必须存在相应的目录。

2.HDFS HA

HA.png

HA 的 namenode 主要分为共享 editLog 机制和 ZKFC 对 namenode 状态的控
制。

  1. 集群中存在多个 namenode,这些 namenode 都有状态,分为 active 和 standby 状态。
  2. 然后各个 namenode 之间通过共享文件系统存储编辑日志文件。active master 将信息写入共享存储系统,而 standby master 则读取该信息以保持与 active master 的同步,从而减少切换时间。
  3. 此外,datanode 还需同时向各个 namenode 发送数据块处理报告。
  4. 每一个 namenode 运行着一个轻量级的故障转移控制器 ZKFC。用于监视和 控制 namenode 进程。ZKFC 是基于 Zookeeper 实现的,启动的时候会创建 HealthMonitor 和 ActiveStandbyElector 这两个组件,创建的同时也会向 HealthMonitor 和 ActiveStandbyElector 注册相应的回调方法。

HealthMonitor:主要负责检测 NameNode 的健康状态,如果检测到 NameNode 的状态发生变化,会回调 ZKFailoverController 的相应方法进行自动的主备选举。
ActiveStandbyElector:主要负责完成自动的主备选举,内部封装了 Zookeeper 的处理逻辑,一旦 Zookeeper 主备选举完成,会回调 ZKFailoverController 的 相应方法来进行 NameNode 的主备状态切换。


HA高可用.png
  1. HealthMonitor 初始化完成之后会启动内部的线程来定时调用对应 NameNode 的 HAServiceProtocol RPC 接口,对 NameNode 的健康状态进行 检测。
  2. HealthMonitor 如果检测到 NameNode 的健康状态发生变化,会回调 ZKFailoverController 注册的相应方法进行处理。
  3. 如果 ZKFailoverController 判断需要进行主备切换,会首先使用 ActiveStandbyElector 来进行自动的主备选举。
  4. ActiveStandbyElector 与 Zookeeper 进行交互完成自动的主备选举。
  5. ActiveStandbyElector 与 Zookeeper 进行交互完成自动的主备选举完成后, 会回调 ZKFailoverController 的相应方法来通知当前的 NameNode 成为主 NameNode 或备 NameNode.
  6. ZKFailoverController 调用对应 NameNode 的 HAServiceProtocol RPC 接口 的方法将 NameNode 转换为 Active 状态或 Standby 状态。

Fencing(防御脑裂)实现: Hadoop 公共库中对外供了两种 fencing 实现, 分别是 sshfence 和 shelllfence(缺省实现) ,其中 sshfence 是指通过 ssh 登陆 目标 Master 节点上,使用命令 kill 将进程杀死(通过 tcp 端口号定位进程 pid,该方法比 jps 命令更准确);shellfence 执行自定义脚本。

判断是否脑裂: 自身故障,它会先删除持久化节点然后再关闭。如果是脑裂的 话,它只是临时节点消息,持久化还存在。 所以我们这边可以通过判断持久化 节点是否存在,来判断是否是因为自身故障。

你可能感兴趣的:(大数据面试 | 02 HDFS难点---HDFS 联邦和HDFS HA)