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),提升性能与可靠性。