1. 前提准备
确保所有节点(至少2台NameNode、3台JournalNode、多台DataNode)已安装JDK(1.8及以上)、Hadoop(2.7及以上),并配置好SSH免密登录(节点间可无密码互相访问),网络互通(能互相解析主机名)。
2. 配置JournalNode集群(元数据同步基础)
JournalNode用于存储NameNode的编辑日志(edits log),确保Active与Standby NameNode元数据一致。在每台JournalNode节点上:
hdfs-site.xml,添加JournalNode数据目录配置:<property>
<name>dfs.journalnode.edits.dir</name>
<value>/path/to/journalnode/data</value> <!-- 本地存储路径,需提前创建 -->
</property>
$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode
hdfs namenode -formatJournalNode
3. 配置NameNode高可用(核心步骤)
在hdfs-site.xml中添加以下关键配置(以集群名称mycluster为例):
<!-- 集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集群内的NameNode列表(逗号分隔) -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value> <!-- nn1:Active NameNode; nn2:Standby NameNode -->
</property>
<!-- Active NameNode的RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>namenode1-host:8020</value>
</property>
<!-- Standby NameNode的RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>namenode2-host:8020</value>
</property>
<!-- 共享编辑日志目录(JournalNode集群地址,奇数个节点,如3个) -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://jn1-host:8485;jn2-host:8485;jn3-host:8485/mycluster</value>
</property>
<!-- 客户端故障转移代理(自动选择Active NameNode) -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 自动故障转移开关(必须开启) -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 故障转移隔离机制(防止脑裂,推荐sshfence) -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- SSH私钥路径(用于故障转移时的隔离操作) -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value> <!-- 替换为实际私钥路径 -->
</property>
在core-site.xml中配置默认文件系统:
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value> <!-- 指向集群名称 -->
</property>
4. 同步NameNode元数据(初始化Standby节点)
在Active NameNode(如namenode1)上执行格式化:
hdfs namenode -format
启动Active NameNode:
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
在Standby NameNode(如namenode2)上同步元数据:
hdfs namenode -bootstrapStandby
启动Standby NameNode:
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
5. 配置ZooKeeper Failover Controller(ZKFC,自动故障转移核心)
ZKFC用于监控NameNode状态,触发自动故障转移。在hdfs-site.xml中添加:
<!-- 开启ZKFC服务 -->
<property>
<name>dfs.zkfc.enable</name>
<value>true</value>
</property>
<!-- ZKFC端口(默认8080,可自定义) -->
<property>
<name>dfs.zkfc.port</name>
<value>8080</value>
</property>
<!-- ZooKeeper集群地址(需与ZooKeeper配置一致,奇数个节点) -->
<property>
<name>dfs.zkfc.hosts</name>
<value>zk1-host:2181,zk2-host:2181,zk3-host:2181</value>
</property>
在每台NameNode节点上启动ZKFC服务:
$HADOOP_HOME/sbin/hadoop-daemon.sh start zkfc
6. 启动HDFS集群并验证
$HADOOP_HOME/sbin/start-datanode.sh
$HADOOP_HOME/sbin/start-dfs.sh
hdfs dfsadmin -report # 查看NameNode、DataNode状态
namenode1的NameNode服务),观察Standby NameNode(namenode2)是否自动切换为Active状态(可通过Web界面或hdfs dfsadmin -report确认)。7. 后续维护与优化
/path/to/journalnode/data)和NameNode元数据目录(如/path/to/namenode/name),防止数据丢失。$HADOOP_HOME/logs),排查潜在问题(如元数据同步延迟、节点通信故障)。dfs.replication副本数,默认3;dfs.blocksize块大小,默认128MB),提升性能与可靠性。