ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

HDFS的高可用性HA配置实战

2021-06-11 10:04:53  阅读:227  来源: 互联网

标签:HDFS hdfs site hadoop slave1 sh 高可用性 master HA


文章目录

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

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

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

a. 规划图
在这里插入图片描述
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
在这里插入图片描述
b1. 同步原本master已经存在的元数据到slave1,在master执行
scp -r ~/bigdata/dfs/name/ hadoop-sny@slave1:~/bigdata/dfs/
b2. 除了第一步的手动拷贝,也可以用下面方式实现:
先启动master上的namenode
hadoop-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. 启动HDFS
start-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的状态!

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
在这里插入图片描述
执行完后,进入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,至此,所有配置以及完成。
在这里插入图片描述

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 | 简书 |

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


标签:HDFS,hdfs,site,hadoop,slave1,sh,高可用性,master,HA
来源: https://blog.51cto.com/u_12564104/2895561

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有