环境
- CentOS 7
- JAVA 1.8
- Zookeeper 2.9.2
- Hadoop 3.4.14
如何解决NameNode的单节点问题
多个NameNode备份原NameNode数据
如何解决多个NameNode是集群脑裂问题
使用QJM,QJM(Quorum Journal Manager)
是Hadoop专门为Namenode共享存储开发的组件。其集群运行一组Journal Node
,每个Journal 节点暴露一个简单的RPC接口,允许Namenode读取和写入数据,数据存放在Journal节点的本地磁盘。当Namenode写入edit log
时,它向集群的所有Journal Node发送写入请求,当多数节点回复确认成功写入之后,edit log就认为是成功写入。例如有3个Journal Node,Namenode如果收到来自2个节点的确认消息,则认为写入成功。
而在故障自动转移的处理上,引入了监控Namenode状态的ZookeeperFailController(ZKFC)。ZKFC一般运行在Namenode的宿主机器上,与Zookeeper集群协作完成故障的自动转移。整个集群架构图如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qcs6IyNJ-1590331418486)(/images/HDFS高可用集群搭建/SouthEast.png)]
在HA集群中如何ZK与NameNode active
出现网络延迟问题这种情况,ZK会自动将NameNode standby
切换为活跃节点,这个时候就出现了多个active节点,也就意味着现有集群面临脑裂问题
使用JournalNode
hostname | 所运行服务 | IP地址 |
---|---|---|
zk1 | zkNode1 | 按照实际IP地址 |
zk2 | zkNode2 | 按照实际IP地址 |
zk3 | zkNode3 | 按照实际IP地址 |
hadoop1 | NameNode(active) & DataNode & JournalNode & ZKFC | 按照实际IP地址 |
hadoop2 | NameNode(standby) & DataNode & JournalNode & ZKFC | 按照实际IP地址 |
hadoop3 | DataNode & JournalNode & ZKFC | 按照实际IP地址 |
(1) 修改所有机器hostname
vi /etc/hostname
(2) 配置hosts文件,将ip地址与主机名进行映射
vi /etc/hosts
(3) 重启机器
(4) 配置ssh免密登录,实现start-dfs.sh执行的机器可以免密登录其他的NameNode和DataNode节点
1. hadoop1: ssh-keygen -t -rsa
2. hadoop1: ssh-copy-id hadoop1
3. hadoop1: ssh-copy-id hadoop2
4. hadoop1: ssh-copy-id hadoop3
(5) 配置JAVA环境
(6) 修改环境变量
#进入配置文件
vi /etc/profile
# 添加如下配置
export JAVA_HOME=/usr/java/jdk1.8.0_251-amd64
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
# 更新配置
source /etc/profile
tar -zxvf zookeeper文件
mkdir /home/zkdata
zk1: echo "1" >> /home/zkdata/myid
zk2: echo "2" >> /home/zkdata/myid
zk3: echo "3" >> /home/zkdata/myid
vi /home/zkdata/zoo.cfg
配置内容如下
# 3001为client端口
# 3002为原子广播端口
# 3003为选举投票端口
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/zkdata
clientPort=3001
server.1=zk1:3002:3003
server.2=zk2:3002:3003
server.3=zk3:3002:3003
./zkServer.sh start /home/zkdata/zoo.cfg
./zkServer.sh status /home/zkdata/zoo.cfg
yum install psmisc -y
# 添加如下配置
export HADOOP_HOME=/home/hadoop-2.9.2
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 更新配置
source /etc/profile
(1) 配置hadoop-env.sh
修改JAVA相关配置
(2) 配置core-site.xml
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://nsvalue>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/home/hadoop-2.9.2/datavalue>
property>
<property>
<name>ha.zookeeper.quorumname>
<value>zk1:3001,zk2:3001,zk3:3001value>
property>
configuration>
(3) 配置hdfs-site.xml
<configuration>
<property>
<name>dfs.nameservicesname>
<value>nsvalue>
property>
<property>
<name>dfs.ha.namenodes.nsname>
<value>nn1,nn2value>
property>
<property>
<name>dfs.namenode.rpc-address.ns.nn1name>
<value>hadoop1:9000value>
property>
<property>
<name>dfs.namenode.http-address.ns.nn1name>
<value>hadoop1:50070value>
property>
<property>
<name>dfs.namenode.rpc-address.ns.nn2name>
<value>hadoop2:9000value>
property>
<property>
<name>dfs.namenode.http-address.ns.nn2name>
<value>hadoop2:50070value>
property>
<property>
<name>dfs.namenode.shared.edits.dirname>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/nsvalue>
property>
<property>
<name>dfs.journalnode.edits.dirname>
<value>/home/zhangjia/journalvalue>
property>
<property>
<name>dfs.ha.automatic-failover.enabledname>
<value>truevalue>
property>
<property>
<name>dfs.client.failover.proxy.provider.nsname>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvidervalue>
property>
<property>
<name>dfs.ha.fencing.methodsname>
<value>sshfencevalue>
property>
<property>
<name>dfs.ha.fencing.ssh.private-key-filesname>
<value>/home/.ssh/id_rsavalue>
property>
configuration>
(4) 配置slaves
hadoop1
hadoop2
hadoop3
(5) 启动集群
(6) 在任意NameNode节点格式化Zk
hdfs zkfc -formatZK
(7) 出现下面这句话则说明格式化成功
ha.ActiveStandbyElector: Successfully created /hadoop-ha/ns in ZK.
(8) 启动JournalNode节点
因为Journal在HA中需要同步edit log,所以他需要在edit log没有生成之前启动
hadoop1: hadoop-daemon.sh start journalnode
hadoop2: hadoop-daemon.sh start journalnode
hadoop3: hadoop-daemon.sh start journalnode
(9) 使用jps发现JournalNode进程已启动并且在根文件夹出现journal文件夹
(10) 格式化NameNode,在选中的active的节点上执行
hdfs namenode -format ns
(11) 启动hdfs集群
start-dfs.sh
(12) 在standby 的 NameNode节点上执行如下命令进行同步active节点的edit log
hdfs namenode -bootstrapStandby
(13) 启动standby节点的NameNode
hadoop-daemon.sh start namenode
此时进入两个NameNode节点的图形化界面 http://hadoop1:50070 可以发现一个为active一个为standby
(14) 此时HA集群搭建完毕