ssh-keygen生成密钥并分发至所有节点),便于后续元数据同步和故障转移。JournalNode是HDFS高可用的关键组件,用于在Active和Standby NameNode之间同步编辑日志(EditLog),确保元数据一致性。
hdfs-site.xml,添加以下配置:<property>
<name>dfs.journalnode.edits.dir</name>
<value>/path/to/journalnode/data</value> <!-- JournalNode数据存储路径,需提前创建 -->
</property>
$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode
hdfs namenode -formatJournalNode
ZooKeeper用于监控NameNode状态,实现自动故障转移(需提前安装ZooKeeper并配置集群)。
zoo.cfg(所有ZooKeeper节点一致):server.1=zk1:2888:3888
server.2=zk2:2888:3888
server.3=zk3:2888:3888
dataDir目录下创建myid文件,内容为对应服务器ID(如zk1节点的myid内容为1)。zkServer.sh start
在所有NameNode节点上,修改core-site.xml和hdfs-site.xml:
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value> <!-- HDFS集群名称 -->
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>zk1:2181,zk2:2181,zk3:2181</value> <!-- ZooKeeper集群地址 -->
</property>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value> <!-- 与core-site.xml中的fs.defaultFS一致 -->
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value> <!-- NameNode标识(Active为nn1,Standby为nn2) -->
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>nn1:8020</value> <!-- Active NameNode RPC地址 -->
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>nn2:8020</value> <!-- Standby NameNode RPC地址 -->
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>nn1:50070</value> <!-- Active NameNode HTTP地址 -->
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>nn2:50070</value> <!-- Standby NameNode HTTP地址 -->
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://zk1:8485;zk2:8485;zk3:8485/mycluster</value> <!-- JournalNode共享存储路径 -->
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> <!-- 客户端故障转移代理 -->
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value> <!-- 故障转移隔离方法(防止脑裂) -->
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/path/to/private/key</value> <!-- SSH私钥路径(用于隔离) -->
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/path/to/journalnode/data</value> <!-- JournalNode数据目录(与之前一致) -->
</property>
在其中一个NameNode节点(如nn1)上执行格式化操作,生成元数据:
hdfs namenode -format
将格式化后的元数据同步到另一个NameNode节点(如nn2):
hdfs namenode -bootstrapStandby
hadoop-daemon.sh start journalnode)。$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
$HADOOP_HOME/sbin/start-dfs.sh
hdfs dfsadmin -report
输出应显示两个NameNode,其中一个为active,另一个为standby。stop-dfs.sh停止NameNode),等待1-2分钟后,检查Standby NameNode(nn2)是否自动切换为Active状态:hdfs dfsadmin -getServiceState nn2 # 应返回"active"
core-site.xml(fs.defaultFS指向hdfs://mycluster),执行HDFS操作(如hdfs dfs -ls /),确认能正常访问。故障转移后,客户端应自动连接新的Active NameNode。dfs.replication,默认3),确保数据冗余。