Hadoop集群之HDFS伪分布式安装 HA(二)

https://blog.csdn.net/q361239731/article/details/53559681

1、首先看看HA的对象是谁?
主要解决的是NameNode的HA

2、Datanode不需要HA吗?
DataNode的HA是NameNode的checksize机制(主动复制)来解决的

3、NameNode为什么需要HA?
NameNode的2大功能: 
● 为客户端提供读写服务 
● 存放元数据:fsimage+edits 
fsimage是namenode格式化的时候产生的,edits文件是客户端读写上传下载的时候产生的。

4、NN怎么做HA?
● NN Action已经format之后,NN Standby不要format,从JN中去复制Edits文件 
● 将Edits文件不保存在NN Action中,将Edits文件可以保存到另外一个集群(JournalNodes)中(类 似于Session同步时使用的redis集群) 
● DN需要向NN Action 和 NN Standby汇报,确保NN Standby能瞬间接管。 
● 接管的先决条件是:2台NN的元数据一模一样 
● 如何去接管,使用ZooKeeper 
● 3台JN都是一样的,JN来合并fsimage和edits文件,之后会更新文件

我们来看一下SNN的合并流程:

5、NN的HA方案有什么?
HDFS High Availability Using the Quorum Journal Manager 
High Availability With NFS 
HDFS Federation

6、我们采用HDFS High Availability Using the Quorum Journal Manager这种方案,架构图如下:


ZooKeeper提供接管机制: 
● 每一个NN都有一个FailoverController 
● 接管时,做2件事情: 
○ 通过远程命令将FailoverController从Standby状态切换到Active状态(免密码ssh登录) 
○ ZooKeeper通过分布式锁选举机制去选一台NN Standby切换为NN Action 
● ZooKeeper个数一般 >= 3

好了,已经讨论完了采用ZooKeeper来对NN做HA。
那我们的搭建目标是什么?
3台ZooKeeper服务器,3台JN服务器,3台DN服务器,2台NN服务器和ZKFC服务器

首先让我们开始搭建ZooKeeper集群

ZooKeeper集群搭建:(zookeeper-3.4.6.tar.gz:链接: http://pan.baidu.com/s/1dF7iG9N 密码: 7rv7)

node1、node2、node3为ZooKeeper服务器,搭建步骤如下:
将zookeeper-3.4.6.tar.gz上传到/opt目录下,并进行解压,并修改zoo.cfg
cd zookeeper-3.4.6/conf && cp zoo_sample.cfg zoo.cfg
vim zoo.cfg 修改dataDir为dataDir=/opt/zookeeper 
 

在 zoo.cfg中追加如下信息: 
server.1=node1:2888:3888 
server.2=node2:2888:3888 
server.3=node3:2888:3888
mkdir /opt/zookeeper && cd /opt/zookeeper && vim myid(输入1),在node2中执行相应操作(输入2),在node3中执行相应操作(输入3)
添加环境配置:vim /root/.bash_profile 

使用scp命令将zookeepr-3.4.6文件夹和/root/.bash_profile 文件复制到node2和node3中 
    scp -r zookeepr-3.4.6 root@node2:/opt 
    scp -r zookeepr-3.4.6 root@node3:/opt
    scp  /root/.bash_profile root@node2:/root 
    scp  /root/.bash_profile root@node3:/root
1
2
3
4
并应用配置 source /root/.bash_profile
查看启动日志,zookeeper.out(在启动时的当前目录中会创建一个这个文件)确保不出错
启动3台ZooKeeper服务器:zkServer.sh start 

使用 zkCli.sh 启动 ZooKeeper客户端,使用 ls / 命令查看内存数据库 

使用get /zookeeper获取数据库中的信息,使用quit退出 

到此ZooKeeper集群就搭建完毕了
现在让我们开始搭建HA的HDFS集群 
1. HDFS-HA集群搭建:

node1、node2为Active NN、Standby NN和ZKFC,node3、node4、node5为JN,搭建步骤参考《Hadoop集群之HDFS伪分布式安装 非HA(一)》,无Secondary NN(用Standby NN代替了)

在完成上面的搭建步骤之后,做下列事情:

删除hadoop-2.5.1/etc/hadoop/ masters文件 rm -f /opt/hadoop-2.5.1/etc/hadoop/masters
删除配置的hadoop数据文件,rm -r /opt/hadoop-2.5
配置hdfs-site.xml:删除原有的配置信息里面的内容

<property>
            <name>dfs.nameservices</name>
            <value>myhdfscluster</value>
            </property>
<property>
<name>dfs.ha.namenodes.myhdfscluster</name>
<value>nn1,nn2</value>
</property>
<!-- rpc地址和端口 -->
<property>
  <name>dfs.namenode.rpc-address.myhdfscluster.nn1</name>
  <value>node1:8020</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.myhdfscluster.nn2</name>
  <value>node2:8020</value>
</property>
<!-- HTTP地址和端口 -->
<property>
  <name>dfs.namenode.http-address.myhdfscluster.nn1</name>
  <value>node1:50070</value>
</property>
<property>
  <name>dfs.namenode.http-address.myhdfscluster.nn2</name>
  <value>node2:50070</value>
</property>
<!-- JN的地址:端口和读写edits文件的目录myhdfscluster -->
<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://node3:8485;node4:8485;node5:8485/myhdfscluster</value>
</property>
<!-- the Java class that HDFS clients use to contact the Active NameNode -->
<property>
  <name>dfs.client.failover.proxy.provider.myhdfscluster</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 设置ssh免密码登录的秘钥,官网上面的id_rsa改为id_dsa -->
<property>
   <name>dfs.ha.fencing.methods</name>
   <value>sshfence</value>
</property>
<property>
   <name>dfs.ha.fencing.ssh.private-key-files</name>
   <value>/root/.ssh/id_dsa</value>
</property>
<!-- 设置JN存放数据的目录 -->
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/opt/journalnodedata</value>
</property>
<!-- 配置自动接管 -->
<property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
</property>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
配置core-site.xml文件,删除原有的配置信息里面的内容

<!-- 配置ZooKeeper地址和端口 -->
<property>
   <name>ha.zookeeper.quorum</name>
   <value>node1:2181,node2:2181,node3:2181</value>
 </property>
1
2
3
4
5
配置DN的地址,slaves文件(如果你看了上一篇文章,那么这里就不用改了) 


将node1中hadoop的配置文件全部考到其他4台服务器中:scp ./* root@node2:/opt/hadoop-2.5.1/etc/hadoop/

启动3台JN,hadoop-daemon.sh start journalnode,查看启动日志(确保3台都不报错):

tail -200 /opt/hadoop-2.5.1/logs/hadoop-root-journalnode-node3.log
1
在NameNode中(选择的是node1)执行hdfs namenode -format,启动之前需要确保3台JN全部正常启动。

如果出现以下的错误,则表示node3 node4 node5 的防火墙没有关闭。 


出现以下错误,表示node3 node4 node5的JN为启动 

出现下面这信息表示format成功 


拷贝元数据:从NN1中把生成的fsimage和edits文件拷贝到NN2中,使用scp命令即可(官方采用提供的命令:hdfs namenode -bootstrapStandby)

scp -r hadoop-2.5 root@node2:/opt  
1
格式化ZKFC(在任意一台NN中)(ZooKeeper要启动):hdfs zkfc -formatZK,确保没有异常信息(This will create a znode in ZooKeeper inside of which the automatic failover system stores its data.) 


启动集群:start-dfs.sh在node1上输入,以为ndoe1做好了免密码登录(在上一篇中)其他4台服务器。(JNs已经启动) 
启动成功,无任何报错信息 

验证结果:访问node1:50070,看到DataNode有3台live,表示集群启动成功 

三台live 和 3台JN的地址,表示集群完全启动成功 

3台DN的信息 

访问node2:50070,看到DataNode有3台live,表示集群启动成功 

到这里HA环境搭建完毕,可以试试kill掉node1(kill -9 进程ID(nide1中Namenode的进程ID,使用JSP可以查看到)),看是否能自动切换到node2
下面进行一些异常处理 
1、发现多次格式化,无法启动DN了 
- node1多次format之后,出现无法启动DN,查看日志显示下面信息。 

- 上面的解决办法是 
- 在node1上输入 stop-all.sh 
- 然后删除 5台服务器中的/opt/hadoop-2.5 
- 然后启动3台ZooKeeperzk:Server.sh start 
- 重新format node1,hdfs namenode -format,生成元数据文件,并复制到node2上。 
- 启动集群:start-dfs.sh 
- ps查看5台机器的进程:(保持ZooKeeper已启动) 
- - node1:ZooKeeper+NameNode+(ZKFC) 
 
- - node2:ZooKeeper+NameNode+(ZKFC) 
 
- - node3:ZooKeeper+JN+DN 
 
- - node4:ZooKeeper+JN+DN 
 
- - node5:ZooKeeper+JN+DN 


2、kill掉node1中的NN之后,发现node2并不能去自动接管。

查看ZooKeeper的日志信息如下: 

下面显示免密码登录node1失败,需要在node2上做node1的免密码登录 


解决方法为,删除node2中的/~/.ssh/下面的所有文件,并在node2中重新产生私钥和公钥

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
1
2
将node2中公钥scp到node1中

scp id_dsa.pub root@node1:/opt
1
在node1中,将node2的公钥加入到认证文件中,并拷贝自己的公钥到node2中:

cat /opt/id_dsa.pub >> ~/.ssh/authorized_keys
scp ~/.ssh/id_dsa.pub root@node2:/opt
1
2
在node2中,重新将node1的公钥加入认证文件中。

      cat /opt/id_dsa.pub >> ~/.ssh/authorized_keys
1
此时node1与node2可以互相ssh通。

干掉全部进程后(killall java),启动ZooKeeper,启动集群
然后再次干掉node1的NameNode进程,然后查看NN Standby的web页面,已经切换为了Active 


再次启动node1的NN:hadoop-daemon.sh start namenode 


此时,zkfc已经可以自己工作,自动接管NN
结束语
在碰到问题时,不要慌张,要仔细检查日志信息,在启动集群时,都会告诉你相应的日志信息的位置。 
启动集群后,需要使用jps命令查看一下,集群的各节点是否已经正常启动,然后访问50070,看是否能看到节点信息。如果不行再去提问,你需要告诉被提问者,你所遇到的问题,是怎么操作才导致这样的,然后把相应的日志信息也提供给他。

需要补充的是
JournalNode是运行在DataNode上的。
--------------------- 
作者:MR_Radish666 
来源:CSDN 
原文:https://blog.csdn.net/q361239731/article/details/53559681 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值