如何设置具有 HDFS 高可用性的 Hadoop 集群

举报
Donglian Lin 发表于 2021/08/14 10:42:58 2021/08/14
【摘要】 Hadoop 2 中引入了高可用性集群的概念。x 解决 Hadoop 1.x 中的单点故障问题。正如您从我之前的博客中了解到的,HDFS 架构 遵循主/从拓扑,其中 NameNode 充当主守护进程,负责管理其他称为 DataNode 的从节点。这个单一的 Master Daemon 或 NameNode 成为一个瓶颈。虽然,Secondary NameNode 的引入确实防止了我们的数据丢失和减

HDFS 2.x 高可用集群架构

在这篇博客中,我将讨论 HDFS 2.x 高可用性集群架构和设置 HDFS 高可用性集群的过程。 这是大数据 Hadoop 课程的重要组成部分。 本博客中涵盖的主题顺序如下:

  • HDFS HA架构
    • 介绍
    • NameNode 可用性
    • HA架构
    • HA的实现(JournalNode和共享存储)
  • 如何在 Hadoop 集群中设置 HA(Quorum Journal Nodes)?

介绍:

Hadoop 2 中引入了高可用性集群的概念x 解决 Hadoop 1.x 中的单点故障问题。正如您从我之前的博客中了解到的,HDFS 架构 遵循主/从拓扑,其中 NameNode 充当主守护进程,负责管理其他称为 DataNode 的从节点。这个单一的 Master Daemon 或 NameNode 成为一个瓶颈。虽然,Secondary NameNode 的引入确实防止了我们的数据丢失和减轻 NameNode 的一些负担,但是并没有解决 NameNode 的可用性问题。

NameNode 可用性:

如果考虑 HDFS 集群的标准配置,NameNode 就会成为单点故障。这是因为一旦 NameNode 变得不可用,整个集群就会变得不可用,直到有人重新启动 NameNode 或带来一个新的 NameNode。

NameNode 不可用的原因可能是:

  • 像维护工作这样的计划事件会升级软件或硬件。
  • 也可能是由于计划外事件,NameNode 因某些原因崩溃。

在上述任何一种情况下,我们都会遇到无法使用 HDFS 集群的停机时间,这成为一个挑战。 

HDFS HA架构:

让我们了解一下 HDFS HA 架构是如何解决 NameNode 可用性这一关键问题的:

HA 架构通过允许我们在主动/被动配置中拥有两个 NameNode 来解决 NameNode 可用性的问题。因此,我们在高可用性集群中有两个同时运行的 NameNode:

  • 活动名称节点
  • 备用/被动 NameNode。

HDFS HA 架构 - 高可用集群 - Edureka

如果一个 NameNode 出现故障,另一个 NameNode 可以接管责任,从而减少集群停机时间。备用 NameNode 用作备份 NameNode(与辅助 NameNode 不同),它将故障转移功能合并到 Hadoop 集群。因此,使用 StandbyNode,我们可以在 NameNode 崩溃(意外事件)时自动进行故障转移,或者在维护期间进行正常(手动启动)故障转移。 

在 HDFS 高可用集群中维护一致性有两个问题:

  • Active 和 Standby NameNode 应该始终彼此同步,即它们应该具有相同的元数据。这将允许我们将 Hadoop 集群恢复到崩溃时的相同命名空间状态,因此,将为我们提供快速故障转移。
  • 一次应该只有一个活动的 NameNode,因为两个活动的 NameNode 会导致数据损坏。这种场景被称为裂脑场景,其中一个集群被分成更小的集群,每个集群都认为它是唯一的活动集群。为了避免这种情况,围栏已经完成。防护是一种确保在特定时间只有一个 NameNode 保持活动状态的过程。

HA架构的实现:

现在,您知道在 HDFS HA 架构中,我们有两个 NameNode 同时运行。所以,我们可以通过以下两种方式实现主备NameNode配置:

  1. 使用仲裁日志节点
  2. 使用 NFS 的共享存储

让我们了解一下这两种执行方式:

1. 使用仲裁日志节点:

Journalnode - HDFS HA 架构 - Edureka

  • 备用 NameNode 和活动 NameNode 通过一组单独的节点或守护程序(称为 JournalNodes)保持彼此同步 。 JournalNode 遵循环形拓扑,其中节点相互连接以形成环。 JournalNode 为收到的请求提供服务,并将信息复制到环中的其他节点中这在 JournalNode 失败的情况下提供了容错能力。 
  • 活动 NameNode 负责更新 JournalNodes 中存在的 EditLogs(元数据信息)。
  • StandbyNode 读取对 JournalNode 中的 EditLogs 所做的更改,并以恒定方式将其应用于自己的命名空间。
  • 在故障转移期间,StandbyNode 确保它在成为新的 Active NameNode 之前已从 JournalNodes 更新其元数据信息。这使得当前命名空间状态与故障转移之前的状态同步。
  • 两个 NameNode 的 IP 地址对所有 DataNode 都可用,它们向两个 NameNode 发送心跳和块位置信息。这提供了快速故障转移(更少的停机时间),因为 StandbyNode 具有有关集群中块位置的更新信息。

NameNode的围栏:

现在,如前所述,确保一次只有一个活动 NameNode 非常重要。因此,围栏是确保集群中的这一特性的过程。 

  • JournalNodes 通过一次只允许一个 NameNode 作为写入者来执行这种防护。
  • 备用 NameNode 负责写入 JournalNodes 并禁止任何其他 NameNode 保持活动状态。
  • 最后,新的 Active NameNode 可以安全地执行其活动。   

2. 使用共享存储:

共享存储 - HDFS HA 架构 - Edureka

  • StandbyNode 和活动的 NameNode 使用共享存储设备保持同步。 活动 NameNode 将在其命名空间中所做的任何修改的记录记录到此共享存储中存在的 EditLog。 StandbyNode 读取对此共享存储中的 EditLogs 所做的更改并将其应用于自己的命名空间。
  • 现在,如果发生故障转移,StandbyNode 首先使用共享存储中的 EditLogs 更新其元数据信息。然后,它承担了 Active NameNode 的责任。这使得当前命名空间状态与故障转移之前的状态同步。
  • 管理员必须至少配置一种防护方法以避免出现裂脑情况。
  • 该系统可以采用一系列围栏机制。它可能包括终止 NameNode 的进程并撤销其对共享存储目录的访问权限。
  • 作为最后的手段,我们可以使用一种称为 STONITH 的技术来隔离之前处于活动状态的 NameNode,或者“在头部射击另一个节点”。STONITH 使用专门的配电单元强行关闭 NameNode 机器。

自动故障转移:

故障转移是系统在检测到故障或故障时自动将控制转移到辅助系统的过程。有两种类型的故障转移:

Graceful Failover: 在这种情况下,我们手动启动故障转移以进行日常维护。

自动故障转移: 在这种情况下,在 NameNode 故障(计划外事件)的情况下会自动启动故障转移。

Apache Zookeeper 是一种在 HDFS 高可用性集群中提供自动故障转移功能的服务。它维护少量的协调数据,通知客户端该数据的变化,并监控客户端的故障。Zookeeper 与 NameNode 保持会话。如果发生故障,会话将过期,Zookeeper 将通知其他 NameNode 启动故障转移过程。在 NameNode 失败的情况下,其他被动 NameNode 可以在 Zookeeper 中锁定,声明它想成为下一个 Active NameNode。

ZookeerFailoverController (ZKFC) 是一个 Zookeeper 客户端,它也监控和管理 NameNode 状态。每个 NameNode 也运行一个 ZKFC。ZKFC 负责定期监控 NameNode 的健康状况。

现在您已经了解了 Hadoop 集群中的高可用性,是时候设置它了。要在 Hadoop 集群中设置高可用性,您必须在所有节点中使用 Zookeeper。

Active NameNode 中的守护进程是:

  • 动物园管理员
  • Zookeeper 故障转移控制器
  • 日志节点
  • 名称节点

备用 NameNode 中的守护进程是:

  • 动物园管理员
  • Zookeeper 故障转移控制器
  • 日志节点
  • 名称节点

DataNode 中的守护进程是:

  • 动物园管理员
  • 日志节点
  • 数据节点

如果您想掌握 HDFS 和 Hadoop,请查看 Edureka 特别策划的大数据和 Hadoop 课程。单击下面的按钮开始。

成为 HDFS 专家!

在 Hadoop 中设置和配置高可用性集群:

您必须首先设置每个节点的 Java 和主机名。

Virtual machine  IP address Host name
Active NameNode 192.168.1.81 nn1.cluster.com or nn1
Standby NameNode 192.168.1.58 nn2.cluster.com or nn2
DataNode 192.168.1.82 dn1.cluster.com or dn1

下载 Hadoop 和 Zookeeper 二进制 tar 文件,解压缩文件以编辑配置文件。

命令: wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz

Zookeeper 下载 - 高可用集群 - Edureka

解压 zookeeper-3.4.6.tar.gz

命令:tar –xvf zookeeper-3.4.6.tar.gz

解压 ZooKeeper 包 - 高可用性集群 - Edureka

从 Apache Hadoop 站点下载稳定的 Hadoop 二进制 tar。

命令:wget https://archive.apache.org/dist/hadoop/core/hadoop-2.6.0/hadoop-2.6.0.tar.gz

Hadoop 下载 HA - 高可用集群 - Edureka

Extract the Hadoop tar ball.

命令:tar –xvf hadoop-2.6.0.tar.gz

下载 Hadoop 二进制文件并解压。

解压 hadoop 二进制文件。

将 Hadoop、Zookeeper 和路径添加到 .bashrc 文件。

打开 .bashrc 文件。

命令:sudo gedit ~/.bashrc

添加以下路径:

export HADOOP_HOME=< Path to your Hadoop-2.6.0 directory>
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export JAVA_HOME=<Path to your Java Directory>
export ZOOKEEPER_HOME =<Path to your Zookeeper Directory>
export PATH=$PATH: $JAVA_HOME/bin: $HADOOP_HOME/bin: $HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin

将 Hadoop 和 zookeeper 路径添加到 .bashrc 文件

编辑 .bashrc 文件。

在所有节点中启用 SSH。

在所有节点中生成 SSH 密钥。

命令:ssh-keygen –t rsa(所有节点中的这一步)

在所有节点中设置 SSH 密钥

在所有节点中设置 SSH 密钥。

不要提供 Enter 文件的任何路径来保存密钥,也不要提供任何密码。按回车键。

在所有节点生成ssh密钥过程。

生成 ssh 密钥后,您将获得公钥和私钥。

.ssh 密钥目录应包含权限 700,.ssh 目录中的所有密钥应包含权限 600。

更改SSH目录权限

更改 SSH 目录权限。

修改目录为.ssh,修改文件权限为600

更改公钥和私钥权限

更改公钥和私钥权限。

您必须将 Name 节点 ssh 公钥复制到所有节点。

在 Active Namenode 中,使用 cat 命令复制 id_rsa.pub。

命令:cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

将 Namenode ssh 密钥复制到它的授权密钥

将 Namenode ssh 密钥复制到它的授权密钥。

使用ssh-copy-id命令将 NameNode 公钥复制到所有节点。

命令:ssh-copy-id –i .ssh/id_rsa.pub edureka@nn2.cluster.com

将目的密钥复制到备用 NameNode

将用途密钥复制到备用 NameNode。

将 NameNode 公钥复制到数据节点。

命令:ssh-copy-id –i .ssh/id_rsa.pub edureka@dn1.cluster.com

将 Namenode 公钥复制到数据节点。

将 Namenode 公钥复制到数据节点。

重启所有节点的sshd服务。

命令:sudo service sshd restart(在所有节点中执行)

重启SSH服务

重启 SSH 服务。

现在您无需任何身份验证即可从 Namenode 登录到任何节点。

从 Active Name 节点打开 core-site.xml 文件并添加以下属性。

从 Active namenode 编辑 core-site.xml

从 Active namenode 编辑 core-site.xml

在 Active Namenode 中打开 hdfs-site.xml 文件。添加以下属性。

<property> 
 <name>dfs.namenode.name.dir</name> 
 <value>/home/edureka/HA/data/namenode</value> 
 </property> 
 <property> 
 <name>dfs.replication</name > 
 <value>1</value> 
 </property> 
 <property> 
 <name>dfs.permissions</name> 
 <value>false</value> 
 </property> 
 <property> 
 <name>dfs.nameservices</name > 
 <value>ha-cluster</value> 
 </property> 
 <property> 
 <name>dfs.ha.namenodes.ha-cluster</name> 
 <value>nn1,nn2</value> 
 </property> 
 <属性> 
 <name>dfs.namenode.rpc-address.ha-cluster.nn1</name> 
 <value>nn1.cluster.com:9000</value> 
 </property>
 <property> 
 <name>dfs.namenode.rpc-address.ha-cluster.nn2</name> 
 <value>nn2.cluster.com:9000</value> 
 </property> 
 <property> 
 <name>dfs.namenode .http-address.ha-cluster.nn1</name> 
 <value>nn1.cluster.com:50070</value> 
 </property> 
 <property> 
 <name>dfs.namenode.http-address.ha-cluster。 nn2</name> 
 <value>nn2.cluster.com:50070</value> 
 </property> 
 <property> 
 <name>dfs.namenode.shared.edits.dir</name> 
 <value>qjournal://nn1 .cluster.com:8485;nn2.cluster.com:8485;dn1.cluster.com:8485/ha-cluster</value> 
 </property>
 <property> 
 <name>dfs.client.failover.proxy.provider.ha-cluster</name>
 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> 
 </property> 
 <property> 
 <name>dfs.ha.automatic-failover.enabled</name> 
 <value>true< /value> 
 </property> 
 <property> 
 <name>ha.zookeeper.quorum</name> 
 <value> nn1.cluster.com:2181,nn2.cluster.com:2181,dn1.cluster.com:2181 </ value> 
 </property> 
 <property> 
 <name>dfs.ha.fencing.methods</name> 
 <value>sshfence</value> 
 </property> 
 <property> 
 <name>dfs.ha.fencing.ssh.private -key-files</name> 
 <value>/home/edureka/.ssh/id_rsa</value> 
 </property>

将目录更改为zookeeper的conf目录。

命令:cd zookeeper-3.4.6/conf

将当前目录更改为 Zookeeper Conf 目录

Zookeeper Conf 目录。

在您有 zoo_sample.cfg 文件的 conf 目录中,使用 zoo_sample.cfg 文件创建 zoo.cfg。

命令:cp zoo_sample.cfg zoo.cfg

创建 zoo.cfg 文件

创建 zoo.cfg 文件。

在任意位置创建目录,并使用该目录存储zookeeper数据。

命令:mkdir <path, where you want to store the zookeeper files>

创建一个目录来存储zookeeper数据

创建一个目录来存储zookeeper数据。

打开 zoo.cfg 文件。

命令:gedit zoo.cfg

将在上述步骤中创建的目录路径添加到 dataDir 属性,并在 zoo.cfg 文件中添加有关剩余节点的以下详细信息。

Server.1=nn1.cluster.com:2888:3888

Server.2=nn2.cluster.com:2888:3888

Server.3=dn1.cluster.com:2888:3888

编辑 zoo.cfg 文件

编辑 zoo.cfg 文件。

现在使用 scp 命令将 Java 和 Hadoop-2.6.0、zookeeper-3.4.6 目录和 .bashrc 文件复制到所有节点(备用名称节点、数据节点)。

命令:scp -r <目录路径> edureka@<ip 地址>:<需要复制的路径>

将 Hadoop、Zookeeper 和 .bashrc 文件复制到所有节点

将 Hadoop、Zookeeper 和 .bashrc 文件复制到所有节点。

同理,将.bashrc文件和zookeeper目录复制到所有节点,并根据各自的节点更改每个节点中的环境变量。

在数据节点中,创建您需要存储 HDFS 块的任何目录。

在数据节点中,您必须添加 dfs.datanode.data.dir 属性。

就我而言,我创建了datanode目录来存储块。

创建Datanode目录

创建Datanode目录。

更改数据节点目录的权限。

更改Datanode目录权限

更改 Datanode 目录权限。

打开 HDFS-site.xml 文件,在 dfs.datanode.data.dir 属性中添加此 Datanode 目录路径。

注意:保留从 Active namenode 复制的所有属性;在 namenode 中添加 dfs.datanode.data.dir 一个提取属性。

<property> 
<name> dfs.datanode.data.dir</name> 
<value>/home/edureka/HA/data/datanode</value> 
</property>

在 Active namenode 中,更改要存储 zookeeper 配置文件的目录(dataDir 属性路径)。

在目录中创建 myid 文件并将数字 1 添加到文件中并保存文件。

命令:vi myid

创建 myid 文件

创建 myid 文件。

在备用名称节点中,更改要存储 zookeeper 配置文件的目录(dataDir 属性路径)。

在目录中创建 myid 文件并将数字 2 添加到文件中并保存文件。

在数据节点中,更改要存储 zookeeper 配置文件的目录(dataDir 属性路径)。

在目录中创建 myid 文件并将数字 3 添加到文件中并保存文件。

在所有三个节点中启动Journalnode。

命令:hadoop-daemon.sh 启动journalnode

启动日志节点

启动日志节点。

当您输入 jps 命令时,您将在所有节点中看到 JournalNode 守护进程。

格式化活动名称节点。

命令:HDFS 目的 -format

格式化活动名称节点

活动 NameNode 格式。

启动 Namenode 守护进程和 Active Namedode。

命令:hadoop-daemon.sh 启动目的

开始命名和活动节点

启动名称节点。

将 HDFS Meta 数据从活动名称节点复制到备用名称节点。

命令:HDFS 预期 -bootstrapStandby

将 HDFS Meta 数据从 Active Name 节点复制到 Standby Name 节点

将 HDFS 元数据从 Active Name node 复制到 Standby Namenode。

运行此命令后,您将获得元数据正在复制的节点和位置以及是否成功复制的信息。

活动目的详情的信息

活动目的详细信息的信息。

一旦元数据从活动名称节点复制到备用名称节点,您将在屏幕截图中看到以下消息。

备用名称节点中有关 HDFS 的信息

关于备用 Namenode 中 HDFS 的信息。

在备用名称节点机器上启动名称节点守护进程。

命令:hadoop-daemon.sh 启动目的

现在在所有三个节点中启动 Zookeeper 服务。

命令:zkServer.sh start(在所有节点运行此命令)

在主动目的中:

在 Active Name Node 中启动 zookeeper

在 Active NameNode 中启动 zookeeper。

在备用 Namenode 中:

在备用名称节点中启动 zookeepr

在备用 NameNode 中启动 zookeeper。

在数据节点中:

在数据节点启动zookeeper

在 DataNode 中启动 zookeeper。

运行Zookeeper服务器后,输入JPS命令。在所有节点中,您将看到 QuorumPeerMain 服务。

在数据节点机器中启动数据节点守护进程。

命令:hadoop-daemon.sh 启动数据节点

在活动名称节点和备用名称节点中启动 Zookeeper 故障转移控制器。

在 Active namenode 中格式化 zookeeper 故障转移控制器。

命令: HDFS zkfc –formatZK

格式 ZKFC

格式化 ZKFC。

在 Active namenode 中启动 ZKFC。

命令:hadoop-daemon.sh 启动 zkfc

输入 jps 命令以检查 DFSZkFailoverController 守护进程。

启动中肯德基

启动 ZKFC。

在 Standby namenode 中格式化 zookeeper 故障转移控制器。

命令:hdfs zkfc –formatZK

在 Standby namenode 中启动 ZKFC。

命令:hadoop-daemon.sh 启动 zkfc

输入 jps 命令以检查 DFSZkFailoverController 守护进程。

现在使用以下命令检查每个 Namenode 的状态,哪个节点处于活动状态或哪个节点处于待机状态。

命令:hdfs haadmin –getServiceState nn1

检查每个名称节点的状态

检查每个 NameNode 的状态。

现在使用 Web 浏览器检查每个 Namenode 的状态。

打开 Web 浏览器并输入以下 URL。

<活动Namenode的IP地址>:50070

它将显示名称节点是活动的还是备用的。

活动名称节点

活动 NameNode。

使用 Web 浏览器打开另一个名称节点详细信息。

Sandby 名称节点

备用NameNode。

在 Active namenode 中,杀死 namenode 守护程序以将 Standby name node 更改为 active namenode。

在 Active namenode 中输入 jps 并终止守护进程。

命令: sudo kill -9 <namenode 进程 ID>

守护进程 ID

守护进程 ID。

Namenode进程ID是7606,杀掉namenode。

命令 :Sudo kill -9 7606

杀死名称节点进程

杀死名称节点进程

通过网络浏览器打开两个节点并检查状态。

名称节点详情

名称节点详细信息。

名称节点状态

NameNode 状态。

恭喜,您已成功在 Hadoop 中设置 HDFS 高可用性集群。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。