前提: 已经有搭建过hadoop集群了,本文章主要是在Hadoop条件下搭建HA,
现在让我们先在主节点master搭建HA,并测试:
搭建HA的步骤:(要保证各master,slave1,slave2三个可以互相ssh无密登陆)
1. 创建软链接:
ln -s hadoop_cluster_ha hadoop
原因是:我们需要经常修改我们hadoop/etc/hadoop下的各种.xml文件,但是有时候我们可能 需要的不是HA
的配置文件,而是其他状态,这个时候可以把etc下的.xml文件复制成hadoop_cluster_ha,和hadoop_cluster,
一方面:可以随时切换我们的集群环境;另一方面:可以防止我们把集群玩坏;
2.修改配置文件:hdfs-site.xml 和 core-site.xml
1)hdfs-site.xml
1.修改【hdfs-site.xml】 //表示注释
<property>
<name>dfs.nameservices</name>
<value>mycluster</value> //此新名称服务的逻辑名称
</property>
//指定两个namenode的唯一标识:注意一定是两个
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
//修改namenode RPC访问端口 , 要监听的每个NameNode的完全限定RPC地址
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>master:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>slave1:9000</value>
</property>
//修改http-WEBUI访问端口,要监听的每个NameNode的完全限定HTTP地址
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>master:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>slave1:50070</value>
</property>
//标识NameNodes写入/读取编辑的一组JNs的URI,就是journalnode的节点
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value>
</property> //**在三个节点上声明了journal协议,所以要在三个节点开启journalnode服务
这是一个配置JournalNodes地址的地方,它提供共享编辑存储,由Active
nameNode写入并由Standby NameNode读取,以保持Active NameNode所做的所
有文件系统更改的最新状态。
// HDFS客户端用于联系Active NameNode的Java类
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
</value>
</property>
// SSH到Active NameNode并终止进程
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
//该选项是以逗号分隔的SSH私钥文件列表
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hyxy/.ssh/id_rsa</value>
</property>
2) core-site.xml
2.修改【core-site.xml】
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
// - JournalNode守护程序将存储其本地状态的路径
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hyxy/tmp/journal</value>
</property>
<property>
<name>ipc.client.connect.max.retries</name>
<value>20</value> //最大连接次数,修改大一点,为20,默认10
<description>Indicates the number of retries a client will make to establish
a server connection.
</description>
</property>
<property>
<name>ipc.client.connect.retry.interval</name>
<value>1000</value> //重复连接的间隔1000ms=1s
<description>Indicates the number of milliseconds a client will wait for
before retrying to establish a server connection.
</description>
</property>
3.将修改的配置文件分发到其他节点
命令:$> scp -r etc/ hyxy@slave1:~/soft/hadoop/
$> scp -r etc/ hyxy@slave2:~/soft/hadoop/
注意:分发之后的软链接失效 ,需要重新创建:先删除 etc$> rm -r hadoop
etc$> ln -s hadoop_cluster_ha hadoop
4.在【master:8485'slave1:8485;slave2:8485】三个节点上分别开启journalnode,
【开启之后会新建 空的: ~/tmp/journal ,初始化 后会有镜像文件】
命令:hadoop-daemon.sh start journalnode
命令:jps
[hyxy@master ~]$ jps
16138 Jps
16107 JournalNode
原因:start-dfs.sh ,会先开启namenode ,最后在master,slave1两个节点会有一个namendoe连接
不上journalnode ,然后该有的namenode会挂掉。
5.一旦启动了JournalNodes,就必须首先同步两个HA NameNodes的磁盘元数据 ,有如下三种方式:
A>.如果要设置新的HDFS集群,则应首先在其中一个NameNode上运行format命令
$>hdfs namenode -format
慎用!!!
原因: 会把原有的数据全都格式化。
B.>.如果您已经格式化了NameNode,或者正在将启用了HA的群集转换为启用HA,
在未格式化的NameNode(slave1,即nn2)上,则现在应该通过运行命令“ hdfs namenode -bootstrapStandby”
将NameNode元数据目录 的内容复制到另一个未格式化的NameNode上。
首先:确保JournalNode开启, 在master上(nn1)开启namenode:
$> hadoop-daemon.sh start namenode
其次: 在nn2上执行以下命令;
$>hdfs namenode -bootstrapStandby //目的:主要是复制master的镜像文件到slave1中,
因为slave1是备用的namenode。
此时,slave1的journal文件还没有东西
说明:将nn1节点的fsimage复制到nn2中【{HADOOP_TMP_DIR}/dfs/name】
即是: ~/tmp/hadoop/dfs/name*
C>.如果要将非HA NameNode转换为HA,则应运行命令“ hdfs namenode -initializeSharedEdits ”,
该命令将使 用来自本地NameNode编辑目录的编辑数据初始化JournalNodes。
在nn1上,执行以下命令;
首先 : $>hadoop-daemon.sh stop namenode(先关闭namenode)
其次 : $>hdfs namenode -initializeSharedEdits // 初始化共享的编辑
此时,初始化后,journal文件夹有了内容,是mycluster,它是复制master的镜像文件
【 /home/hyxy/tmp/journal/mycluster/current 】
说明: 使三个节点【master ,slave1, slave2】的JournalNode日志信息要一致。
6.开启:start-dfs.sh
[hyxy@master mycluster]$ jps
16838 NameNode
17126 Jps
16107 JournalNode
[hyxy@slave1 mycluster]$ jps
16838 NameNode
16594 DataNode
17126 Jps
16107 JournalNode
[hyxy@slave2 mycluster]$ jps
6838 DataNode
7126 Jps
6107 JournalNode
7.验证:分别打开浏览器master:50070 和slave1:50070,查看nn1和nn2的相关信息,均为standby(备用状态)
8. HA 集群管理:
用法:hdfs haadmin
[ -transitionToActive <serviceId>] // 将给定NameNode的状态转换为Active
[-transitionToStandby <serviceId>] // 将给定NameNode的状态转换为Standby
[-failover [--forcefence] [--forceactive] <serviceId> <serviceId>]
[-getServiceState <serviceId>]
[-checkHealth <serviceId> ]
[-help <command>]
手动切换Active/Standby状态:
$>hdfs haadmin -transitionToActive nn1
$>hadoop fs -put tt.txt
$>hdfs haadmin -transitionToStandby nn1
$>hdfs haadmin -transitionToActive nn2
$>hadoop fs -put tt1.txt
总结:
HA: 主要是为了防止namenode故障,journalnode同步两个HA namendoe磁盘元数据,
一个挂掉,另一个就会读取journalnode里面信息,变成namendoe了。
journalnode:实现共享元数据,
当备用节点看到编辑时,它会将它们应用到自己的命名空间。如果发生故障转移,
Standby将确保在将自身升级为Active状态之前已从JournalNodes读取所有编辑内容。
这可确保在发生故障转移之前完全同步命名空间状态。