HDFS的高可用性HA配置实战

文章目录

0x00 文章内容
  1. HDFS之HA环境准备
  2. 配置HA实战
  3. 配置Zookeeper自动切换状态

相关指南:
安装好Zookeeper( => D003 复制粘贴玩大数据之安装与配置Zookeeper集群
安装好了HDFS( => Hadoop核心组件之HDFS的安装与配置

0x01 HDFS之HA环境准备
1. 集群规划

a. 规划图
HDFS的高可用性HA配置实战
b. 实验说明:由于服务器只有三台,所以此处使用slave1做为备master

2. 备份原本的配置

原因:因为我想操作完之后想恢复回非HA模式,如果想一直使用,则忽略此步骤
a. 备份core-site.xml
cp $HADOOP_HOME/etc/hadoop/core-site.xml $HADOOP_HOME/etc/hadoop/core-site.xml_bak
b. 备份hdfs-site.xml
cp $HADOOP_HOME/etc/hadoop/hdfs-site.xml $HADOOP_HOME/etc/hadoop/hdfs-site.xml_bak

3. 停止HDFS集群

a. 停止HDFS(如未启动则忽略)
stop-dfs.sh

0x02 配置HA实战
1. 修改hdfs-site.sh配置

a. 在master节点的hdfs-site.sh添加配置
vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml

<property>
		<name>dfs.nameservices</name>
        <value>mycluster</value>
        <description>HDFS名字节点服务的逻辑名称,可以是任意值</description>
</property>
<property>
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2</value>
        <description>每一个NameNode在集群中的唯一标识</description>
</property>
<property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>master:8020</value>
        <description>nn1这个名字节点在RPC的时候使用的端口</description>
</property>
<property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>slave1:8020</value>
        <description>nn2这个名字节点在RPC的时候使用的端口</description>
</property>
<property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>master:50070</value>
        <description>nn1这个NameNode对外提供的http服务的端口</description>
</property>
<property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>slave1:50070</value>
        <description>nn2这个NameNode对外提供的http服务的端口</description>
</property>
<property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value>
       <description>标识Journal组</description>
</property>
<property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/home/hadoop-sny/bigdata/dfs/journal/data</value>
        <description>存储Journal数据的地方</description>
</property>
<property>
        <name>dfs.client.failover.proxy.provider.mycluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        <description>用于Java客户端来连接Active的nameNode</description>
</property>
<property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
        <description>用于在nameNode失败的时候不会对外提供服务</description>
</property>

<property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/hadoop-sny/.ssh/id_rsa</value>
        <description>用于在nameNode失败的时候不会对外提供服务</description>
</property>

b. 因为配置里用到了ssh,而且备节点是slave1,所以要配置slave1能免密码登录上master,如果配置了,我们可以跳过,在slave1上操作
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
scp ~/.ssh/authorized_keys hadoop-sny@master:~/.ssh/
能在slave1免密码登录上master则表示成功
ssh master

2. 修改core-site.sh配置

a. 在master节点的core-site.sh修改fs.defaultFS配置为
vi $HADOOP_HOME/etc/hadoop/core-site.xml

<property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
        <description>HDFS的基本路径</description>
</property>
3. 同步配置到slaves

a. 同步hdfs-site.sh到slave1与slave2
~/shell/scp_all.sh $HADOOP_HOME/etc/hadoop/hdfs-site.xml
b. 同步core-site.sh到slave1与slave2
~/shell/scp_all.sh $HADOOP_HOME/etc/hadoop/core-site.xml

4. 启动journalnode并同步元数据

a. 在master、slave1和slave2上均执行(此时三个节点可以没有进程)
~/bigdata/hadoop-2.7.5/sbin/hadoop-daemon.sh start journalnode
HDFS的高可用性HA配置实战
b1. 同步原本master已经存在的元数据到slave1,在master执行
scp -r ~/bigdata/dfs/name/ hadoop-sny@slave1:~/bigdata/dfs/
b2. 除了第一步的手动拷贝,也可以用下面方式实现:
先启动master上的namenode
hadoop-daemon.sh start namenode
HDFS的高可用性HA配置实战
在slave1中执行下面语句来同步两个namenode的数据
~/bigdata/hadoop-2.7.5/bin/hdfs namenode -bootstrapStandby
HDFS的高可用性HA配置实战
执行完,发现slave1节点上也有了name文件夹,且master上最后一个fsimage(编号fsimage......14816)已经同步过来 HDFS的高可用性HA配置实战
HDFS的高可用性HA配置实战
c. 在master中执行下面语句来初始化journal node的数据
如果初始化前,启动了master上的namenode要先停止
hadoop-daemon.sh stop namenode
否则会报下面的错:
HDFS的高可用性HA配置实战
初始化journal node的数据
hdfs namenode -initializeSharedEdits
执行完后,可以发现三台服务器所配的路径/home/hadoop-sny/bigdata/dfs/journal/data下都有了edit.log与fsimages文件
HDFS的高可用性HA配置实战
d. 对比三台机器current路径下的最后一条edit.log,都是一样的。
执行完后,可以去看一下三台机器此路径下的current的edit.log与namenode路径下的edit.log做比较,其实最后一条数据是一样的。
HDFS的高可用性HA配置实战
HDFS的高可用性HA配置实战
e. 如果是全新的搭建HA的HDFS集群,在执行第a步后,就可以直接在master中格式化整个HDFS即可,(因为此处是在原本有HDFS的基础上搭建,所以,此步省略)
hdfs namenode -format

5. 校验HA配置

a. 启动HDFS
start-dfs.sh
会发现我们的namenode会从两台机器上启动
HDFS的高可用性HA配置实战
b. 查看nn1、nn2这个nameNode的状态(即master、slave1的状态)
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
HDFS的高可用性HA配置实战
发现两个都是standby状态,需要手动设置为活跃:
c. 将nn1设置为active状态
hdfs haadmin -transitionToActive nn1
如需设置为Standby,可参考下面命令
hdfs haadmin -transitionToStandby nn1
HDFS的高可用性HA配置实战
至此可以手动设置HDFS的namenode的状态!

0x03 配置Zookeeper自动切换状态
1. 配置hdfs-site.xml、core-site.xml

a. 停止HDFS
stop-dfs.sh
b. 配置master上的hdfs-site.xml,添加内容:
vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml

<property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
</property>

c. 配置master上的core-site.xml,添加内容:
vi $HADOOP_HOME/etc/hadoop/core-site.xml

<property>
        <name>ha.zookeeper.quorum</name>
        <value>master:2181,slave1:2181,slave2:2181</value>
</property>

d. 同步配置文件到slave1和slave2上:
~/shell/scp_all.sh $HADOOP_HOME/etc/hadoop/hdfs-site.xml
~/shell/scp_all.sh $HADOOP_HOME/etc/hadoop/core-site.xml

2. 初始化ZooKeeperFailoverController

a. 启动三台服务器的Zookeeper,不启动会报错
zkServer.sh start
b. 初始化ZooKeeperFailoverController,在master中执行
~/bigdata/hadoop-2.7.5/bin/hdfs zkfc -formatZK
HDFS的高可用性HA配置实战
执行完后,进入ZK的客户端,会发现多了一个hadoop-ha的节点,此节点用于进行master的选举。
c. 在master中执行
start-dfs.sh

3. 验证Zookeeper自动切换状态结果

a. 查看进程及两个namenode的状态
HDFS的高可用性HA配置实战
http://master:50070
HDFS的高可用性HA配置实战
http://slave1:50070
HDFS的高可用性HA配置实战
b. 可以查看集群的内容(如果是standby状态,WEB UI界面是看不到的)
hadoop fs -ls hdfs://mycluster/
HDFS的高可用性HA配置实战
c. 杀死active的namenode看看namenode的active是否会转换:
hadoop-daemon.sh stop namenode
或者kill掉master上的namenode进程,重新回去查看50070端口,发现状态slave1已切换成active,至此,所有配置以及完成。
HDFS的高可用性HA配置实战

0xFF 总结
  1. 如果发现自己状态无法自动改变,请检查hdfs-site.xml里面的配置的私钥路径(dfs.ha.fencing.ssh.private-key-files)是否正确,然后重新初始化zkfc,然后重新启动ZK与HDFS集群。
    查看日志:
    tail -fn200 /home/hadoop-sny/bigdata/hadoop-2.7.5/logs/hadoop-hadoop-sny-zkfc-master.log

如报错:java.lang.RuntimeException: Unable to fence NameNode at slave1/192.168.128.132:8020
可能是没有安装fuser,用root用户在master和slave1上安装fuser:
yum -y install psmisc

更多原因可参考此文章:Hadoop HA:active节点失效后standby 节点无法被拉起

  1. 请与HBase的HA配置做一下对比。
  2. 学习,其实用非HA模式也够了,有需要请看下面的教程:HDFS恢复非HA状态,而且,我的教程也将会采取非HA模式进行开发,如需参考更多,请恢复非HA状态,感谢大家的支持。

作者简介:邵奈一
全栈工程师、市场洞察者、专栏编辑
| 公众号 | 微信 | 微博 | CSDN | 简书 |

福利:
邵奈一的技术博客导航
邵奈一 原创不易,如转载请标明出处。


上一篇:YARN与MapReduce的配置与使用


下一篇:HUE学习笔记(二)——Hue编译安装