文章目录
0x00 文章内容- HDFS之HA环境准备
- 配置HA实战
- 配置Zookeeper自动切换状态
相关指南:
安装好Zookeeper( => D003 复制粘贴玩大数据之安装与配置Zookeeper集群 )
安装好了HDFS( => Hadoop核心组件之HDFS的安装与配置 )
1. 集群规划
a. 规划图
b. 实验说明:由于服务器只有三台,所以此处使用slave1做为备master
2. 备份原本的配置
原因:因为我想操作完之后想恢复回非HA模式,如果想一直使用,则忽略此步骤
a. 备份core-site.xmlcp $HADOOP_HOME/etc/hadoop/core-site.xml $HADOOP_HOME/etc/hadoop/core-site.xml_bak
b. 备份hdfs-site.xmlcp $HADOOP_HOME/etc/hadoop/hdfs-site.xml $HADOOP_HOME/etc/hadoop/hdfs-site.xml_bak
3. 停止HDFS集群
a. 停止HDFS(如未启动则忽略)stop-dfs.sh
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
b1. 同步原本master已经存在的元数据到slave1,在master执行scp -r ~/bigdata/dfs/name/ hadoop-sny@slave1:~/bigdata/dfs/
b2. 除了第一步的手动拷贝,也可以用下面方式实现:
先启动master上的namenodehadoop-daemon.sh start namenode
在slave1中执行下面语句来同步两个namenode的数据~/bigdata/hadoop-2.7.5/bin/hdfs namenode -bootstrapStandby
执行完,发现slave1节点上也有了name文件夹,且master上最后一个fsimage(编号fsimage......14816
)已经同步过来
c. 在master中执行下面语句来初始化journal node的数据
如果初始化前,启动了master上的namenode要先停止hadoop-daemon.sh stop namenode
否则会报下面的错:
初始化journal node的数据hdfs namenode -initializeSharedEdits
执行完后,可以发现三台服务器所配的路径/home/hadoop-sny/bigdata/dfs/journal/data
下都有了edit.log与fsimages文件
d. 对比三台机器current路径下的最后一条edit.log,都是一样的。
执行完后,可以去看一下三台机器此路径下的current的edit.log与namenode路径下的edit.log做比较,其实最后一条数据是一样的。
e. 如果是全新的搭建HA的HDFS集群,在执行第a步后,就可以直接在master中格式化整个HDFS即可,(因为此处是在原本有HDFS的基础上搭建,所以,此步省略)hdfs namenode -format
5. 校验HA配置
a. 启动HDFSstart-dfs.sh
会发现我们的namenode会从两台机器上启动
b. 查看nn1、nn2这个nameNode的状态(即master、slave1的状态)hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
发现两个都是standby状态,需要手动设置为活跃:
c. 将nn1设置为active状态hdfs haadmin -transitionToActive nn1
如需设置为Standby,可参考下面命令hdfs haadmin -transitionToStandby nn1
至此可以手动设置HDFS的namenode的状态!
1. 配置hdfs-site.xml、core-site.xml
a. 停止HDFSstop-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
执行完后,进入ZK的客户端,会发现多了一个hadoop-ha的节点,此节点用于进行master的选举。
c. 在master中执行start-dfs.sh
3. 验证Zookeeper自动切换状态结果
a. 查看进程及两个namenode的状态
http://master:50070
http://slave1:50070
b. 可以查看集群的内容(如果是standby状态,WEB UI界面是看不到的)hadoop fs -ls hdfs://mycluster/
c. 杀死active的namenode看看namenode的active是否会转换:hadoop-daemon.sh stop namenode
或者kill掉master上的namenode进程,重新回去查看50070端口,发现状态slave1已切换成active,至此,所有配置以及完成。
- 如果发现自己状态无法自动改变,请检查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 节点无法被拉起
- 请与HBase的HA配置做一下对比。
- 学习,其实用非HA模式也够了,有需要请看下面的教程:HDFS恢复非HA状态,而且,我的教程也将会采取非HA模式进行开发,如需参考更多,请恢复非HA状态,感谢大家的支持。
作者简介:邵奈一
全栈工程师、市场洞察者、专栏编辑
| 公众号 | 微信 | 微博 | CSDN | 简书 |
福利:
邵奈一的技术博客导航
邵奈一 原创不易,如转载请标明出处。