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的合并流程:

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这种方案,架构图如下:

QJM架构

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集群

  1. 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
      • 并应用配置 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>
    • 配置core-site.xml文件,删除原有的配置信息里面的内容

      <!-- 配置ZooKeeper地址和端口 -->
      <property>
         <name>ha.zookeeper.quorum</name>
         <value>node1:2181,node2:2181,node3:2181</value>
       </property>
    • 配置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
    • 在NameNode中(选择的是node1)执行hdfs namenode -format,启动之前需要确保3台JN全部正常启动

    • 如果出现以下的错误,则表示node3 node4 node5 的防火墙没有关闭。
      这里写图片描述

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

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

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

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

    • 启动集群:start-dfs.sh在node1上输入,以为ndoe1做好了免密码登录(在上一篇中)其他4台服务器。(JNs已经启动)
      启动成功,无任何报错信息
      启动集群成功
    • 验证结果:访问node1:50070,看到DataNode有3台live,表示集群启动成功
      50070界面
    • 三台live 和 3台JN的地址,表示集群完全启动成功
      具体信息
    • 3台DN的信息
      DN的信息
    • 访问node2:50070,看到DataNode有3台live,表示集群启动成功
      node2的50070

到这里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)
node1
- - node2:ZooKeeper+NameNode+(ZKFC)
node2
- - node3:ZooKeeper+JN+DN
nbode3
- - node4:ZooKeeper+JN+DN
node4
- - 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
    • 将node2中公钥scp到node1中

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

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

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

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

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

    • 此时,zkfc已经可以自己工作,自动接管NN

结束语

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

需要补充的是

JournalNode是运行在DataNode上的。

猜你喜欢

转载自blog.csdn.net/q361239731/article/details/53559681