欢迎光临
我们一直在努力

草履虫都能学会的Hadoop高可用的搭建

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}

在Hadoop集群中,NameNode作为整个HDFS集群的核心节点,负责管理文件系统的元数据和命名空间,一旦出现单点故障,将导致整个集群不可用。因此,搭建NameNode高可用(HA)架构是生产环境中保障集群稳定性的必备操作。本文基于3台CentOS服务器(hadoop11、hadoop12、hadoop13),详细记录Hadoop 3.1.4版本NameNode高可用的完整搭建过程,从环境准备到故障测试,每一步都附带实操命令和注意事项,新手可直接跟着操作,避免踩坑。

一、搭建前准备(重中之重)

在开始搭建前,有一个必须执行的操作——给三台服务器拍摄快照!!!

快照可以保存当前服务器的完整状态,后续搭建过程中如果出现配置错误、服务启动失败等问题,可快速回滚到初始状态,避免重复部署的麻烦,这一步一定要重视,不要省略。

本次搭建环境说明:

  • 服务器:3台CentOS 7虚拟机,主机名分别为hadoop11、hadoop12、hadoop13

  • Hadoop版本:3.1.4

  • JDK版本:1.8

  • ZooKeeper:已提前在三台服务器上部署完成(集群模式)

  • 两个脚本 xcall实现批量执行 myscp实现文件分发。两个脚本放入/usr/local/bin

  • xcall

  • #! /bin/bash

    if(($#==0))
    then
    echo "请提供参数"
    exit
    fi

    echo "要执行的命令是:$@"

    for((i=11;i<=13;i++))
    do
    echo "========= hadoop$i ============="
    ssh hadoop$i "source /etc/profile;$@"
    done

    myscp

  • #! /bin/bash

    pcount=$#
    if [ $pcount -eq 0 ];then
    echo no args;
    exit;
    fi

    #myscp /root/haha
    pname=$1

    fname=`basename $pname`

    #echo '$fname='$fname

    pdir=`cd -P $(dirname $pname);pwd`

    #echo '$pdir='$pdir

    uname=`whoami`

    for((i=12;i<=13;i++))
    do
    echo "scp -r $pdir/$fname $uname@hadoop$i:$pdir"
    scp -r $pdir/$fname $uname@hadoop$i:$pdir
    done

  • 核心目标:实现NameNode双节点(hadoop11、hadoop12)高可用,hadoop13作为DataNode和JournalNode节点

二、分步搭建流程(全程实操可复制)

第一步:配置免密登录(NameNode节点互访)

NameNode高可用架构中,两个NameNode节点(hadoop11、hadoop12)需要能够免密登录到集群中所有节点(hadoop11、hadoop12、hadoop13),用于后续服务启动、故障切换等操作。

# 登录hadoop11服务器
ssh hadoop11

# 生成RSA密钥对(一路回车,不设置密码)
ssh-keygen -t rsa

# 将公钥发送到三台服务器(实现免密登录)
ssh-copy-id hadoop11
ssh-copy-id hadoop12
ssh-copy-id hadoop13

# 登录hadoop12服务器
ssh hadoop12

# 生成RSA密钥对(一路回车,不设置密码)
ssh-keygen -t rsa

# 将公钥发送到三台服务器(实现免密登录)
ssh-copy-id hadoop11
ssh-copy-id hadoop12
ssh-copy-id hadoop13

验证:在hadoop11/12上执行ssh hadoop13,无需输入密码即可登录,说明免密配置成功

第二步:安装psmisc工具(故障切换必备)

ZKFC(ZooKeeper Failover Controller)用于实现NameNode的自动故障切换,其远程杀死假死NameNode进程时,会用到killall namenode命令,该命令属于psmisc软件包,因此需要在三台服务器上统一安装。

由于hadoop11已配置xcall批量执行命令,直接在hadoop11上执行以下命令,批量安装psmisc:

xcall yum install -y psmisc

注意:如果执行yum命令时出现镜像报错,可先执行以下命令修复CentOS镜像:

wage -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

如果提示wage找不到方法 就把wage换成curl

第三步:检查前置环境(避免后续报错)

搭建前需确保三台服务器的JDK、ZooKeeper已安装完成且可用,避免因前置环境缺失导致搭建失败:

# 1. 检查JDK(三台服务器均需执行,或用xcall批量检查)
xcall java -version

# 2. 检查ZooKeeper(三台服务器均需执行)
xcall zkServer.sh status

验证标准:JDK版本显示为1.8,ZooKeeper集群中一台为leader,两台为follower,说明前置环境正常。

第四步:清理Hadoop旧数据(若已部署过集群)

如果是全新部署Hadoop,可跳过此步骤,但建议确认数据目录为空。如果三台服务器之前已部署过Hadoop集群,需先停止集群并清理数据和日志,避免旧配置和数据干扰高可用搭建:

# 1. 停止原有Hadoop集群(在hadoop11上执行)
stop-all.sh

# 2. 批量删除Hadoop数据和日志目录(三台服务器同时执行)
xcall rm -rf /opt/installs/hadoop3.1.4/data /opt/installs/hadoop3.1.4/logs/

第五步:配置hadoop-env.sh

hadoop-env.sh是Hadoop的环境配置文件,需要指定JDK路径和各组件的运行用户,避免启动时出现权限错误。

 登录hadoop11,编辑hadoop-env.sh文件:

vim /opt/installs/hadoop3.1.4/etc/hadoop/hadoop-env.sh

添加以下配置(替换原有对应配置,无则新增):

export JAVA_HOME=/opt/installs/jdk1.8

# 指定各Hadoop组件的运行用户(均为root)
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root

同步配置文件到hadoop12和hadoop13(使用自定义的myscp批量同步命令):

myscp /opt/installs/hadoop3.1.4/etc/hadoop/hadoop-env.sh

第六步:配置core-site.xml

core-site.xml是Hadoop的核心配置文件,主要配置HDFS的临时目录、入口地址和ZooKeeper集群地址,用于关联高可用相关组件。跟上文中的hadoop-env.sh在一个文件夹里。

替换文件中的<configuration>标签内容为以下配置:

&lt;configuration&gt;
<!– HDFS集群临时文件存储位置 –>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/installs/hadoop3.1.4/data</value>
&lt;/property&gt;
<!– HDFS入口地址,设置虚拟命名服务(后续关联两个NameNode) –>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hdfs-cluster&lt;/value&gt;
&lt;/property&gt;
<!– HDFS访问ZooKeeper集群的地址(三台节点,端口2181) –>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop11:2181,hadoop12:2181,hadoop13:2181</value>
</property>
</configuration>

第七步:配置hdfs-site.xml(高可用核心配置)

hdfs-site.xml是HDFS的核心配置文件,用于定义NameNode高可用的相关参数,包括命名服务、两个NameNode的地址、JournalNode存储目录、故障切换规则等,是搭建高可用的关键步骤,它依旧在hadoop文件夹里。

替换文件中的<configuration>标签内容为以下配置(注释已标注关键作用,可直接复制):

<configuration>
<!– HDFS文件副本数(与集群节点数一致,此处3台节点设为3) –>
<property>
<name>dfs.replication</name>
<value>3</value>
</property&gt;
<!– 定义HDFS入口的命名服务(与core-site.xml中fs.defaultFS的后缀一致) –>
<property>
<name>dfs.nameservices</name>
<value>hdfs-cluster</value&gt;
&lt;/property&gt;
<!– 定义命名服务下的两个NameNode节点(nn1对应hadoop11,nn2对应hadoop12) –>
<property>
<name>dfs.ha.namenodes.hdfs-cluster</name>
<value>nn1,nn2</value>
</property>
<!– nn1(hadoop11)的RPC通信端口(默认8020) –>
<property>
<name>dfs.namenode.rpc-address.hdfs-cluster.nn1</name>
<value>hadoop11:8020</value>
&lt;/property&gt;
<!– nn1(hadoop11)的HTTP访问端口(Hadoop3.x默认9870,替代Hadoop2.x的50070) –>
<property>
<name>dfs.namenode.http-address.hdfs-cluster.nn1</name>
<value>hadoop11:9870</value>
</property>
<!– nn2(hadoop12)的RPC通信端口 –>
<property>
<name>dfs.namenode.rpc-address.hdfs-cluster.nn2</name>
<value>hadoop12:8020</value>
</property&gt;
<!– nn2(hadoop12)的HTTP访问端口 –>
<property>
<name>dfs.namenode.http-address.hdfs-cluster.nn2</name>
<value>hadoop12:9870</value>
</property&gt;

<!– JournalNode的元数据存储目录(用于同步两个NameNode的元数据) –>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/installs/journalnode/data/&lt;/value&gt;
&lt;/property&gt;
<!– 两个NameNode共享的元数据存储地址(关联三台JournalNode) –>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop11:8485;hadoop12:8485;hadoop13:8485/hdfs-cluster&lt;/value&gt;
&lt;/property&gt;

<!– 开启NameNode自动故障切换 –>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>

<!– 基于ZooKeeper的故障切换实现类 –>
<property>
<name>dfs.client.failover.proxy.provider.hdfs-cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider&lt;/value&gt;
&lt;/property&gt;

<!– 远程杀死假死NameNode的方式(避免双主节点冲突) –>
<property>
<name>dfs.ha.fencing.methods</name>
&lt;value&gt;sshfence&lt;/value&gt;
&lt;/property&gt;
<!– 指定免密登录的私钥路径(用于远程杀死NameNode进程) –>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>

<!– 开启WebHDFS功能(可通过网页查看HDFS文件) –>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property><!– 关闭HDFS启动时的权限检查(避免权限不足导致启动失败) –>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
<description>如果为"true",则在HDFS中启用权限检查;如果为"false",则关闭权限检查;默认值为"true"。</description>
 </property>
</configuration>

第八步:同步核心配置文件(三台节点保持一致)

# 同步core-site.xml
myscp /opt/installs/hadoop3.1.4/etc/hadoop/core-site.xml

# 同步hdfs-site.xml
myscp /opt/installs/hadoop3.1.4/etc/hadoop/hdfs-site.xml

第九步:集群初始化与服务启动(关键步骤)

此步骤需严格按照顺序执行,否则会出现启动失败、元数据同步异常等问题,每一步都需等待执行完成后再进行下一步。

# 1. 启动ZooKeeper集群(三台节点同时启动,或用zk.sh批量启动)
zk.sh start

# 2. 初始化ZKFC在ZooKeeper中的节点(第一次搭建需执行,仅在hadoop11上运行)
hdfs zkfc -formatZK

# 3. 启动JournalNode服务(三台节点同时启动,用于存储NameNode元数据)
xcall hdfs –daemon start journalnode
# 注意:必须先启动JournalNode,否则后续格式化NameNode会报8485端口连接超时错误

# 4. 格式化NameNode(仅在hadoop11上执行,第一次搭建需执行)
hdfs namenode -format

# 5. 启动HDFS集群(在hadoop11上执行)
start-dfs.sh
# 注意:start-dfs.sh会默认启动JournalNode,由于已单独启动,会出现3个警告,可忽略

# 6. 启动第二个NameNode(在hadoop12上执行,第一次搭建需执行)
# 第一步:同步hadoop11的NameNode元数据(仅第一次执行)
hdfs namenode -bootstrapStandby
# 第二步:启动hadoop12的NameNode服务
hdfs –daemon start namenode

补充说明:

  • hdfs namenode -bootstrapStandby:用于将hadoop11(Active NameNode)的元数据同步到hadoop12(Standby NameNode),第一次启动hadoop12的NameNode必须执行,后续无需重复。

  • 如果后续需要重新搭建,需执行以下重置操作:

    # 1. 进入ZooKeeper客户端,删除hadoop-ha节点
    zkCli.sh
    deleteall /hadoop-ha
    quit

    # 2. 批量删除三台节点的JournalNode数据目录
    xcall rm -rf /opt/installs/journalnode/data/

    # 3. 批量删除Hadoop数据和日志目录
    xcall rm -rf /opt/installs/hadoop3.1.4/data/
    xcall rm -rf /opt/installs/hadoop3.1.4/logs/

    配置完成后,后续启动高可用集群只需执行start-dfs.sh(ZooKeeper需单独启动和管理)。

第十步:通过网页查看NameNode状态

Hadoop 3.x提供了Web界面用于查看NameNode的状态,通过浏览器访问以下地址,验证两个NameNode是否正常运行,且状态分别为Active和Standby:

  • hadoop11(nn1):http://hadoop11:9870 状态应为:Active

  • hadoop12(nn2):http://hadoop12:9870 状态应为:Standby

验证标准:网页能正常打开,显示HDFS相关信息,且两个NameNode的状态正确。

第十一步:高可用故障切换测试(核心验证)

搭建完成后,需测试故障切换功能是否正常,即手动关闭Active NameNode(hadoop11),查看Standby NameNode(hadoop12)是否能自动切换为Active状态,确保集群正常可用。

# 1. 在hadoop11上,手动关闭NameNode服务
hdfs –daemon stop namenode

# 2. 查看hadoop12的NameNode状态(两种方式)
# 方式1:通过网页查看(http://hadoop12:9870),状态应变为Active
# 方式2:在hadoop12上执行命令查看
hdfs haadmin -getServiceState nn2

hadoop12的NameNode状态从Standby自动切换为Active,集群可正常进行HDFS读写操作,说明高可用搭建成功。

测试完成后,可重新启动hadoop11的NameNode,此时hadoop11会自动变为Standby状态,与hadoop12形成新的主备关系。

三、搭建总结与注意事项

NameNode高可用的核心是通过“双NameNode(Active/Standby)+ JournalNode(元数据同步)+ ZKFC(故障切换)”实现,关键在于配置文件的正确性和服务启动的顺序,搭建完成后,集群可避免因单一NameNode故障导致的不可用问题,提升稳定性。

后续日常使用中,启动顺序为:启动ZooKeeper集群 → 启动HDFS集群(start-dfs.sh);关闭顺序为:关闭HDFS集群(stop-dfs.sh)→ 关闭ZooKeeper集群。

必看注意事项

  • 所有配置文件修改后,必须同步到三台节点,确保配置一致,否则会出现服务启动失败。

  • 启动服务时,必须先启动ZooKeeper,再启动JournalNode,最后启动HDFS,顺序不可颠倒。

  • 第一次启动hadoop12的NameNode时,必须执行hdfs namenode -bootstrapStandby,否则无法同步元数据,启动失败。

  • 免密登录配置必须正确,否则ZKFC无法远程杀死假死的NameNode进程,导致双主节点冲突。

  • 搭建前一定要拍摄服务器快照,便于出现问题时快速回滚,节省时间。

  • 常见问题排查

  • 问题1:启动NameNode时,报“no HDFS_NAMENODE_USER defined”错误? 解决:检查hadoop-env.sh文件,确保已添加各组件的运行用户配置,且同步到所有节点。

  • 问题2:格式化NameNode时,报8485端口连接超时? 解决:先启动JournalNode服务(xcall hdfs –daemon start journalnode),再执行格式化命令。

  • 问题3:故障切换时,Standby NameNode无法自动变为Active? 解决:检查ZooKeeper集群是否正常运行,免密登录是否配置正确,psmisc工具是否安装。

以上就是Hadoop NameNode高可用的完整搭建过程,实操性极强,按照步骤一步步操作,基本可以一次搭建成功。

赞(0)
未经允许不得转载:171主机测评 » 草履虫都能学会的Hadoop高可用的搭建
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址