文章目录
HDFS HA 搭建
配置之前最好将三个基节点的配置文件与Hadoop数据文件夹备份一下,即备份$HADOOP_HOME/etc/hadoop
文件夹与$HADOOP_HOME/tmp
文件夹:
cp -r hadoop/ backup-hadoop
cp -r tmp/ backup-tmp
hdfs-site.xml
配置
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- mycluster为自定义的值,下方配置要使用该值 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 配置两个NameNode的标识符 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 配置两个NameNode所在节点与访问端口 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>centos01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>centos02:8020</value>
</property>
<!-- 配置两个NameNode的web页面访问地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>centos01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>centos02:50070</value>
</property>
<!-- 设置一组JournalNode的URI地址 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://centos01:8485;centos02:8485;centos03:8485/mycluster</value>
</property>
<!-- JournalNode用于存放元数据和状态信息的目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/modules/hadoop-2.8.2/tmp/dfs/jn</value>
</property>
<!-- 客户端与NameNode通信的Java类 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 解决HA集群脑裂问题 -->
<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>
</configuration>
core-site.xml
配置
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/opt/modules/hadoop-2.8.2/tmp</value>
</property>
</configuration>
发送到其他集群
scp etc/hadoop/hdfs-site.xml hadoop@centos02:/opt/modules/hadoop-2.8.2/etc/hadoop/
scp etc/hadoop/hdfs-site.xml hadoop@centos03:/opt/modules/hadoop-2.8.2/etc/hadoop/
scp etc/hadoop/core-site.xml hadoop@centos02:/opt/modules/hadoop-2.8.2/etc/hadoop/
scp etc/hadoop/core-site.xml hadoop@centos03:/opt/modules/hadoop-2.8.2/etc/hadoop/
启动与测试
启动JournalNode进程
删除各个节点$HADOOP_HOME/tmp
目录下的所有文件。分别进入各个节点的Hadoop安装目录,执行以下命令,启动三个节点的JournalNode进程:
sbin/hadoop-daemon.sh start journalnode
格式化NameNode
在节点centos01
:
bin/hdfs namenode -format
启动NameNode1
在节点centos01
:
sbin/hadoop-daemon.sh start namenode
在节点centos02
:
bin/hdfs namenode -bootstrapStandby
启动NameNode2
在节点centos02
:
sbin/hadoop-daemon.sh start namenode
打开浏览器:http://centos01:50070
,http://centos02:50070
将NameNode1的状态置为active
在节点centos01
:
bin/hdfs haadmin -transitionToActive nn1
重新启动HDFS
在节点centos01
:
sbin/stop-dfs.sh
sbin/start-dfs.sh
再次将NameNode的状态置为active
在节点centos01
:
bin/hdfs haadmin -transitionToActive nn1
在各节点执行jps命令
ZooKeeper进行HDFS自动故障转移
开启自动故障转移功能
在节点centos01
:
修改hdfs-site.xml
文件,在文件下方加入以下内容:
<!-- 开启自动故障转移,mycluster为自定义配置的nameservice ID值 -->
<property>
<name>dfs.ha.automatic-failover.enabled.mycluster</name>
<value>true</value>
</property>
指定ZooKeeper集群
在节点centos01
:
修改core-site.xml
文件,在文件下方加入以下内容:
<property>
<name>ha.zookeeper.quorum</name>
<value>centos01:2181,centos02:2181,centos03:2181</value>
</property>
同步其他节点
在节点centos01
:
scp etc/hadoop/hdfs-site.xml hadoop@centos02:/opt/modules/hadoop-2.8.2/etc/hadoop/
scp etc/hadoop/hdfs-site.xml hadoop@centos03:/opt/modules/hadoop-2.8.2/etc/hadoop/
scp etc/hadoop/core-site.xml hadoop@centos02:/opt/modules/hadoop-2.8.2/etc/hadoop/
scp etc/hadoop/core-site.xml hadoop@centos03:/opt/modules/hadoop-2.8.2/etc/hadoop/
停止HDFS集群
sbin/stop-dfs.sh
启动ZooKeeper集群
在三个节点中分别执行:
bin/zkServer.sh start
初始化在ZooKeeper中的状态
在节点centos01
:
bin/hdfs zkfc -formatZK
启动HDFS集群
在节点centos01
:
sbin/start-dfs.sh
启动ZKFC守护进程
在节点centos01
、centos02
:
sbin/hadoop-daemon.sh start zkfc
先启动谁谁就是active(我先启动的centos01)
测试HDFS自动故障转移
首先在节点centos01
中杀掉NameNode的进程,然后执行hdfs命令。若能成功,说明自动故障转移成功
此时centos01节点的NameNode已失效,centos02节点的NameNode自动激活为active
(说明自动故障转移成功)
再测试hdfs命令,虽然有报错,但是的确还是可以成功执行:
…
接下来我们再在节点centos01
重启NameNode:
sbin/hadoop-daemon.sh start namenode
此时centos01
节点复活自动变为standby状态,centos02
节点依旧为active:
再次测试hdfs命令,成功,没有报错: