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

HDFS 2.x 高可用性集群架构

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

  • HDFS HA 架构
    • 介绍
    • 名称节点可用性
    • 架构
    • HA(日志节点和共享存储)的实施
  • 如何在 Hadoop 集群中设置 HA(日志节点)

介绍:

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

名称节点可用性:

如果考虑HDFS集群的标准配置,NameNode将成为单点故障。发生这种情况是因为当NameNode变得不可用时,整个集群将变得不可用,直到有人重新启动NameNode或带来新的NameNode。

NameNode不可用的原因可能是:

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

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

HDFS HA 架构:

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

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

  • Active NameNode
  • Standby NameNode。

HDFS HA Architecture - High Availability Cluster - Edureka

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

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

  • 活动和备用 NameNode 应始终彼此同步,即它们应具有相同的元数据。这将允许我们将Hadoop集群恢复到它崩溃的相同命名空间状态,因此,将为我们提供快速故障转移。
  • 一次只能有一个活动的 NameNode,因为两个活动的 NameNode 会导致数据损坏。这种场景称为裂脑场景,其中集群被划分为较小的集群,每个集群都认为自己是唯一活跃的集群。为了避免这种情况,进行了屏蔽。屏蔽是确保只有一个 NameNode 在特定时间保持活动状态的过程。

HA 架构的实施:

现在,您知道在HDFS HA架构中,我们有两个NameNode同时运行。因此,我们可以通过以下两种方式实现活动和备用名称节点配置:

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

让我们了解这两种实现方式,一次采取一种:

1. 使用仲裁日志节点:

Journalnode - HDFS HA Architecture - Edureka

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

名称节点的围栏:

现在,如前所述,确保一次只有一个活动名称节点非常重要。因此,屏蔽是确保群集中此属性的过程。

  • JournalNode 通过一次只允许一个 NameNode 作为编写器来执行此屏蔽。
  • 备用名称节点接管写入日志节点的责任,并禁止任何其他名称节点保持活动状态。
  • 最后,新的活动名称节点可以安全地执行其活动。

2. 使用共享存储:

Shared Storage - HDFS HA Architecture - Edureka

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

自动故障转移:

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

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

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

Apache Zookeeper 是一项在 HDFS High Availabilty 集群中提供自动故障转移功能的服务。它维护少量的协调数据,通知客户端该数据中的更改,并监视客户端的故障。Zookeeper 维护与 NameNode 的会话。如果发生故障,会话将过期,Zookeeper 将通知其他 NameNode 启动故障转移过程。如果 NameNode 发生故障,其他被动 NameNode 可以在 Zookeeper 中锁定,声明它希望成为下一个 Active NameNode。

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

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

Active NameNode 中的守护进程是:

  • Zookeeper
  • Zookeeper Fail Over controller
  • JournalNode
  • NameNode

Standby NameNode中的守护进程包括:

  • Zookeeper
  • Zookeeper Fail Over controller
  • JournalNode
  • NameNode

DataNode 中的守护进程包括:

  • Zookeeper
  • JournalNode
  • DataNode

在 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 Download - High Availability Cluster - Edureka

解压缩zookeeper-3.4.6.tar.gz

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

Untar Zookeepr Package - High Availability Cluster - Edureka

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

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

Hadoop Download HA - High Availability Cluster - Edureka

提取Hadoop。

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

Download Hadoop binary file and extract it.
Untar 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
Add Hadoop and zookeeper paths to .bashrc file
编辑 .bashrc 文件。

在所有节点中启用 SSH。

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

命令: ssh-keygen –t rsa (此步骤在所有节点中)

Set up SSH key in all the nodes
在所有节点中设置 SSH 密钥。

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

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

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

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

Change the SSH directory permission
更改 SSH 目录权限。

将目录更改为 .ssh,并将文件的权限更改为 600

Change public and private key permission
更改公钥和私钥权限。

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

在“活动名称节点”中,使用 cat 命令复制 id_rsa.pub。

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

Copy Namenode ssh key to it's authorized keys
将名称节点 ssh 密钥复制到其授权密钥。

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

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

Copy namenode key to Standby NameNode
将NameNode密钥复制到备用名称节点。

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

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

Copy Namenode public key to data node.
将NameNode公钥复制到数据节点。

在所有节点中重新启动 sshd 服务。

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

Restart SSH service
重新启动 SSH 服务。

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

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

Edit core-site.xml from Active namenode
从Active Namenode编辑hdfs-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>
 <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

change your current directory to Zookeeper Conf directory
zookeeper目录。

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

命令:cp zoo_sample.cfg zoo.cfg

Create zoo.cfg file
创建zoo.cfg文件。

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

命令:mkdir <path,您要在其中存储zookeeper文件>

create a directory to store zookeeper data
创建一个目录来存储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

Edit zoo.cfg file
编辑zoo.cfg文件。

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

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

Copy Hadoop, Zookeeper and .bashrc file to all nodes
将Hadoop,Zookeeper和.bashrc文件复制到所有节点。

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

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

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

就我而言,我创建了数据节点目录来存储块。

Create Datanode directory
创建数据节点目录。

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

Change Datanode directory permission
更改数据节点目录权限。

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

注意:保留从活动名称节点复制的所有属性;在 NameNode 中添加 dfs.datanode.data.dir 一个提取属性。

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

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

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

命令: vi myid

Create myid file
创建 myid 文件。

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

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

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

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

在所有三个节点中启动日志节点。

命令:hadoop-daemon.sh 启动日志节点

Start the Journalnode
启动日志节点。

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

设置活动名称节点的格式。

命令:HDFS namenode -format

Format Active Name Node
格式化活动名称节点。

在活动名称节点中启动名称节点守护程序。

命令:hadoop-daemon.sh start namenode

Start Namenode in Active Node
启动名称节点。

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

命令:HDFS namenode -bootstrapStandby

Copy the HDFS Meta data from Active name node to Standby Name node
将 HDFS 元数据从活动名称节点复制到备用名称节点。

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

Information of Active namenode details
活动名称节点详细信息的信息。

将元数据从活动名称节点复制到备用名称节点后,您将在屏幕截图中看到如下所示的消息。

Information regarding HDFS in Standby Name node
有关备用名称节点中的 HDFS 的信息。

在备用名称节点计算机中启动名称节点守护程序。

命令:hadoop-daemon.sh start namenode

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

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

在活动名称节点中:

Start zookeeper in Active Name Node
在Active NameNode中启动zookeeper。

在备用名称节点中:

Start zookeepr in standby Name Node
在备用 NameNode 中启动 zookeeper。

在“数据”节点中:

Start zookeeper in Data Node
在 DataNode 中启动 zookeeper。

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

在数据节点计算机中启动数据节点守护程序。

命令:hadoop-daemon.sh start datanode

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

在活动名称节点中格式化动物园管理员故障转移控制器。

命令:HDFS zkfc –formatZK

Format ZKFC
格式 ZKFC.

在活动名称节点中启动 ZKFC。

命令:hadoop-daemon.sh start zkfc

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

Start ZKFC
启动中肯基金会。

在备用名称节点中格式化动物园管理员故障转移控制器。

命令: hdfs zkfc –formatZK

在备用名称节点中启动 ZKFC。

命令:hadoop-daemon.sh start zkfc

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

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

Command: hdfs haadmin –getServiceState nn1

Check status of each Name Node
检查每个名称节点的状态。

现在使用网络浏览器检查每个名称节点的状态。

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

<活动名称节点的 IP 地址>:50070

它将显示名称节点是处于活动状态还是处于备用状态。

Active Name Node
活动名称节点。

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

Sandby Name Node
备用名称节点。

在活动名称节点中,终止名称节点守护程序以将备用名称节点更改为活动名称节点。

在活动名称节点中输入 jps 并杀死守护程序。

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

Daemons Process ID
守护进程 ID。

名称节点进程 ID 为 7606,终止名称节点。

命令:sudo kill -9 7606

终止名称节点进程
终止名称节点进程

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

名称节点详细信息
名称节点详细信息。

命名节点状态

名称节点状态。

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

    THE END
    喜欢就支持一下吧
    点赞11 分享
    评论 抢沙发
    头像
    欢迎您留下宝贵的见解!
    提交
    头像

    昵称

    取消
    昵称表情代码图片

      暂无评论内容