为啥我们在 Hadoop 堆栈中需要 ZooKeeper?

Posted

技术标签:

【中文标题】为啥我们在 Hadoop 堆栈中需要 ZooKeeper?【英文标题】:Why do we need ZooKeeper in the Hadoop stack?为什么我们在 Hadoop 堆栈中需要 ZooKeeper? 【发布时间】:2012-05-30 18:17:41 【问题描述】:

我是 Hadoop/ZooKeeper 的新手。我无法理解将 ZooKeeper 与 Hadoop 一起使用的目的,ZooKeeper 是否在 Hadoop 中写入数据?如果不是,那我们为什么要在 Hadoop 中使用 ZooKeeper?

【问题讨论】:

Hadoop 中哪里使用了 Zookeeper? 【参考方案1】:

Hadoop 1.x 不使用 Zookeeper。即使在 Hadoop 1.x 安装中,HBase 也使用 zookeeper。

Hadoop 从 2.0 版开始也采用了 Zookeeper。

Zookeeper 的目的是集群管理。这符合 *nix 使用较小的专用组件的一般理念 - 因此,想要集群功能的 Hadoop 组件依赖 Zookeeper 而不是自己开发。

Zookeeper 是一个分布式存储,提供以下保证(复制自Zookeeper overview page):

顺序一致性 - 来自客户端的更新将应用于 发送它们的命令。 原子性 - 更新成功或 失败。没有部分结果。 单一系统映像 - 客户端将看到 无论它连接的服务器如何,服务的相同视图 到。 可靠性 - 应用更新后,它将持续存在 从那时起,直到客户端覆盖更新。 及时性 - 保证系统的客户端视图 在一定时间内保持最新。

您可以使用这些来实现集群管理所需的不同“recipes”,例如锁、领导选举等。

如果你打算自己使用 ZooKeeper,我建议你看看Curator from Netflix,它更容易使用(例如,他们实现了一些开箱即用的配方)

【讨论】:

当您说“Hadoop 也从 2.0 版开始采用 Zookeeper”时,这是否意味着 Zookeeper 已包含在 2.0 版以后的 hadoop 发行版中? 由于大多数发行版都包含 HBase,它在 v.2 之前就已经存在。在 V2 中。 YARN 还为 HA 使用 zookeeper(实际上你可以使用不太可靠的方法,但这是推荐的方法,例如 blog.cloudera.com/blog/2014/05/how-apache-hadoop-yarn-ha-works)所以我认为没有它你不会找到或创建分发【参考方案2】:

Zookeeper 解决了可靠的分布式协调问题,而 hadoop 是一个分布式系统,对吧?

有一篇关于这个主题的优秀论文Paxos Algorithm,您可以阅读。

【讨论】:

栈溢出101:大多数情况下越短越好 对于那些觉得 Paxos 难以理解的人来说,Raft 是一个更容易理解的等价物。【参考方案3】:

来自zookeeper 文档页面:

ZooKeeper 是一个集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务。所有这些类型的服务都以某种形式被分布式应用程序使用。

每次实施它们时,都会进行大量工作来修复不可避免的错误和竞争条件。由于实现这些服务的难度,应用程序最初通常会忽略它们,这使得它们在出现变化时变得脆弱并且难以管理。即使正确完成,这些服务的不同实现也会导致应用程序部署时的管理复杂性。

来自hadoop 文档页面:

Apache™ Hadoop® 项目为可靠、可扩展的分布式计算开发开源软件。

Apache Hadoop 软件库是一个框架,允许使用简单的编程模型跨计算机集群分布式处理大型数据集

关于您的查询:

为什么我们需要 Hadoop Stack 中的 ZooKeeper?

绑定因素是分布式处理和高可用性。

例如Hadoop Namenode 故障转移过程。

Hadoop 高可用性是围绕 Active Namenode 和 Standby Namenode 设计的,用于故障转移过程。在任何时候,您都不应该同时拥有两个主节点(活动 Namenode)。

来自HDFSHighAvailabilityWithQJM 上的 Apache 文档链接:

一次只有一个 NameNode 处于活动状态对于 HA 集群的正确运行至关重要。否则,命名空间状态将很快在两者之间产生分歧,从而冒着数据丢失或其他不正确结果的风险。为了确保这个属性并防止所谓的“脑裂场景”,JournalNodes 将永远只允许单个 NameNode 成为作家。

在故障转移期间,即将变为活动的NameNode将简单地接管写入JournalNode的角色,这将有效地防止另一个NameNode继续处于活动状态,从而允许新的活动安全地进行故障转移。

已使用 Zookeeper 来避免脑裂的情况。您可以在以下问题中找到 Zookeeper 的角色:

How does Hadoop Namenode failover process works?

【讨论】:

以上是关于为啥我们在 Hadoop 堆栈中需要 ZooKeeper?的主要内容,如果未能解决你的问题,请参考以下文章

当我们有一个红色区域时,为啥我们需要堆栈分配?

为啥我们需要 Hadoop 无密码 ssh?

为啥我们需要 Hadoop KMS?

为啥我们不能在堆栈上分配动态内存?

为啥调试器需要符号来重建堆栈?

为啥我们需要复制构造函数以及何时应该在 java 中使用复制构造函数