草履虫都能学会的Hadoop高可用的搭建
在Hadoop集群中NameNode作为整个HDFS集群的核心节点负责管理文件系统的元数据和命名空间一旦出现单点故障将导致整个集群不可用。因此搭建NameNode高可用HA架构是生产环境中保障集群稳定性的必备操作。本文基于3台CentOS服务器hadoop11、hadoop12、hadoop13详细记录Hadoop 3.1.4版本NameNode高可用的完整搭建过程从环境准备到故障测试每一步都附带实操命令和注意事项新手可直接跟着操作避免踩坑。一、搭建前准备重中之重在开始搭建前有一个必须执行的操作——给三台服务器拍摄快照快照可以保存当前服务器的完整状态后续搭建过程中如果出现配置错误、服务启动失败等问题可快速回滚到初始状态避免重复部署的麻烦这一步一定要重视不要省略。本次搭建环境说明服务器3台CentOS 7虚拟机主机名分别为hadoop11、hadoop12、hadoop13Hadoop版本3.1.4JDK版本1.8ZooKeeper已提前在三台服务器上部署完成集群模式两个脚本 xcall实现批量执行 myscp实现文件分发。两个脚本放入/usr/local/binxcall#! /bin/bash if(($#0)) then echo 请提供参数 exit fi echo 要执行的命令是$ for((i11;i13;i)) do echo hadoop$i ssh hadoop$i source /etc/profile;$ donemyscp#! /bin/bash pcount$# if [ $pcount -eq 0 ];then echo no args; exit; fi #myscp /root/haha pname$1 fnamebasename $pname #echo $fname$fname pdircd -P $(dirname $pname);pwd #echo $pdir$pdir unamewhoami for((i12;i13;i)) do echo scp -r $pdir/$fname $unamehadoop$i:$pdir scp -r $pdir/$fname $unamehadoop$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工具故障切换必备ZKFCZooKeeper Failover Controller用于实现NameNode的自动故障切换其远程杀死假死NameNode进程时会用到killall namenode命令该命令属于psmisc软件包因此需要在三台服务器上统一安装。由于hadoop11已配置xcall批量执行命令直接在hadoop11上执行以下命令批量安装psmiscxcall 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.8ZooKeeper集群中一台为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.shhadoop-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_USERroot export HDFS_DATANODE_USERroot export HDFS_SECONDARYNAMENODE_USERroot export YARN_RESOURCEMANAGER_USERroot export YARN_NODEMANAGER_USERroot export HDFS_JOURNALNODE_USERroot export HDFS_ZKFC_USERroot同步配置文件到hadoop12和hadoop13使用自定义的myscp批量同步命令myscp /opt/installs/hadoop3.1.4/etc/hadoop/hadoop-env.sh第六步配置core-site.xmlcore-site.xml是Hadoop的核心配置文件主要配置HDFS的临时目录、入口地址和ZooKeeper集群地址用于关联高可用相关组件。跟上文中的hadoop-env.sh在一个文件夹里。替换文件中的configuration标签内容为以下配置lt;configurationgt; !-- HDFS集群临时文件存储位置 -- property namehadoop.tmp.dir/name value/opt/installs/hadoop3.1.4/data/value lt;/propertygt; !-- HDFS入口地址设置虚拟命名服务后续关联两个NameNode -- property namefs.defaultFS/name valuehdfs://hdfs-clusterlt;/valuegt; lt;/propertygt; !-- HDFS访问ZooKeeper集群的地址三台节点端口2181 -- property nameha.zookeeper.quorum/name valuehadoop11: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 namedfs.replication/name value3/value /propertygt; !-- 定义HDFS入口的命名服务与core-site.xml中fs.defaultFS的后缀一致 -- property namedfs.nameservices/name valuehdfs-cluster/valuegt; lt;/propertygt; !-- 定义命名服务下的两个NameNode节点nn1对应hadoop11nn2对应hadoop12 -- property namedfs.ha.namenodes.hdfs-cluster/name valuenn1,nn2/value /property !-- nn1hadoop11的RPC通信端口默认8020 -- property namedfs.namenode.rpc-address.hdfs-cluster.nn1/name valuehadoop11:8020/value lt;/propertygt; !-- nn1hadoop11的HTTP访问端口Hadoop3.x默认9870替代Hadoop2.x的50070 -- property namedfs.namenode.http-address.hdfs-cluster.nn1/name valuehadoop11:9870/value /property !-- nn2hadoop12的RPC通信端口 -- property namedfs.namenode.rpc-address.hdfs-cluster.nn2/name valuehadoop12:8020/value /propertygt; !-- nn2hadoop12的HTTP访问端口 -- property namedfs.namenode.http-address.hdfs-cluster.nn2/name valuehadoop12:9870/value /propertygt; !-- JournalNode的元数据存储目录用于同步两个NameNode的元数据 -- property namedfs.journalnode.edits.dir/name value/opt/installs/journalnode/data/lt;/valuegt; lt;/propertygt; !-- 两个NameNode共享的元数据存储地址关联三台JournalNode -- property namedfs.namenode.shared.edits.dir/name valueqjournal://hadoop11:8485;hadoop12:8485;hadoop13:8485/hdfs-clusterlt;/valuegt; lt;/propertygt; !-- 开启NameNode自动故障切换 -- property namedfs.ha.automatic-failover.enabled/name valuetrue/value /property !-- 基于ZooKeeper的故障切换实现类 -- property namedfs.client.failover.proxy.provider.hdfs-cluster/name valueorg.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProviderlt;/valuegt; lt;/propertygt; !-- 远程杀死假死NameNode的方式避免双主节点冲突 -- property namedfs.ha.fencing.methods/name lt;valuegt;sshfencelt;/valuegt; lt;/propertygt; !-- 指定免密登录的私钥路径用于远程杀死NameNode进程 -- property namedfs.ha.fencing.ssh.private-key-files/name value/root/.ssh/id_rsa/value /property !-- 开启WebHDFS功能可通过网页查看HDFS文件 -- property namedfs.webhdfs.enabled/name valuetrue/value /property!-- 关闭HDFS启动时的权限检查避免权限不足导致启动失败 -- property namedfs.permissions.enabled/name valuefalse/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用于将hadoop11Active NameNode的元数据同步到hadoop12Standby 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.shZooKeeper需单独启动和管理。第十步通过网页查看NameNode状态Hadoop 3.x提供了Web界面用于查看NameNode的状态通过浏览器访问以下地址验证两个NameNode是否正常运行且状态分别为Active和Standbyhadoop11nn1http://hadoop11:9870 状态应为Activehadoop12nn2http://hadoop12:9870 状态应为Standby验证标准网页能正常打开显示HDFS相关信息且两个NameNode的状态正确。第十一步高可用故障切换测试核心验证搭建完成后需测试故障切换功能是否正常即手动关闭Active NameNodehadoop11查看Standby NameNodehadoop12是否能自动切换为Active状态确保集群正常可用。# 1. 在hadoop11上手动关闭NameNode服务 hdfs --daemon stop namenode # 2. 查看hadoop12的NameNode状态两种方式 # 方式1通过网页查看http://hadoop12:9870状态应变为Active # 方式2在hadoop12上执行命令查看 hdfs haadmin -getServiceState nn2hadoop12的NameNode状态从Standby自动切换为Active集群可正常进行HDFS读写操作说明高可用搭建成功。测试完成后可重新启动hadoop11的NameNode此时hadoop11会自动变为Standby状态与hadoop12形成新的主备关系。三、搭建总结与注意事项NameNode高可用的核心是通过“双NameNodeActive/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高可用的完整搭建过程实操性极强按照步骤一步步操作基本可以一次搭建成功。