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

  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:/optscp  /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为启动



    • 出现下面这信息表示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.)

    • 启动集群: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
    • 将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

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

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

结束语

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

需要补充的是

JournalNode是运行在DataNode上的。

Hadoop集群之HDFS伪分布式安装 HA(二)相关推荐

  1. hadoop集群的搭建(分布式安装)

    集群 计算机集群是一种计算机系统,他通过一组松散集成的计算机软件和硬件连接起来高度紧密地协同完成计算工作. 集群系统中的单个计算机通常称为节点,通常通过局域网连接. 集群技术的特点: 1.通过多台计算 ...

  2. hadoop集群之HDFS和YARN启动和停止命令

    2019独角兽企业重金招聘Python工程师标准>>> hadoop集群之HDFS和YARN启动和停止命令 博客分类: hadoop 假如我们只有3台linux虚拟机,主机名分别为h ...

  3. 基于阿里云服务器搭建hadoop集群:HDFS的namenode WEB访问9870端口打不开解决方法

    基于阿里云服务器搭建hadoop集群:HDFS的namenode WEB访问9870端口打不开解决方法 以下是基于我所面临问题的解决办法. 1.在本地的c:windows/system32/dirve ...

  4. hadoop hive集群_基于伪分布式Hadoop搭建Hive平台详细教程

    一.搭建环境的前提条件 环境:Linux系统 Hadoop-2.6.0 MySQL 5.6 apache-hive-2.3.7 这里的环境不一定需要和我一样,基本版本差不多都ok的,所需安装包和压缩包 ...

  5. hadoop hbase java_Hadoop、Hbase伪分布式安装

    环境 本文介绍Hadoop.Hbase的伪分布式安装. 操作系统: Centos7 Hadoop: 2.7.3 Hbase: 1.2.3 Hadoop安装 JAVA_HOME环境变量配置 由于Hbas ...

  6. Hadoop集群中HDFS的API测试案例以及MapReduce的多种提交Job方式案例

    这两个案例默认是hadoop集群环境已经搭建好以及IDEA环境也已经配置好 1.HDFS客户端测试案例 1.1.pom依赖 <?xml version="1.0" encod ...

  7. CDH集群中HDFS单点故障解决方案:HA模式(High Availability)

    CDH集群开发HDFS的High Avaliability模式 Step1 什么是单点故障? Step2 HDFS为什么会出现单点故障?它是怎么解决的? Step3 开启HDFS的高可用(High A ...

  8. hadoop集群之hdfs文件系统常见操作命令

    文章目录 一.介绍 二.文件系统协议 三.常见命令 1.创建文件夹 2.查看指定目录下内容 3.上传文件到HDFS指定目录下 4.下载HDFS文件 5.拷贝HDFS文件 6.追加数据到HFDS文件 四 ...

  9. Hadoop集群搭 Hadoop分布式文件系统架构和设计

    Hadoop集群搭建 先决条件 确保在你集群中的每个节点上都安装了所有必需软件. 获取Hadoop软件包. 安装 安装Hadoop集群通常要将安装软件解压到集群内的所有机器上. 通常,集群里的一台机器 ...

最新文章

  1. 摄像头和相机模型和内参原理
  2. Mongo北京大会3月3号召开!报名抢注火爆进行中!(免费)
  3. 全球及中国皮肤晒黑喷雾行业销售模式及动态盈利分析报告2021年版
  4. VTK:Points之FitImplicitFunction
  5. 根据需要通过代码的方式加载js文件
  6. 第二章节 怀疑的练习和不会的练习
  7. 如何获取codeforces的完整数据
  8. 使用gp部署bginfo在客户端显示信息
  9. jQuery mobile button 禁用和启用
  10. azure创建centos_使用Azure Power BI创建Azure数据仓库报告
  11. 更换jdk版本_滴滴夜莺发布 v3 版本,从运维监控演化成了运维平台
  12. mongo 的逻辑存储和物理存储
  13. 内链接和外连接的区别
  14. 解决MATLAB不能设置为.m .slx .mat等文件默认打开方式
  15. oracle数据库赋权
  16. 吉大17秋计算机应用二,吉大17秋《计算机应用基础》在线作业二.doc
  17. 刚刚,10位青年学者获得阿里达摩院青橙奖,钟南山寄语,每人100万,最小获奖者28岁
  18. 寻找技术中国——渴望不再被扼住喉咙!
  19. ARM指令浅析1(mov、ldr)
  20. Okhttp源码分析以及Google Gson解析json数据实例

热门文章

  1. 笔记 c++ 中 _in_ 含义
  2. 安卓ftp客户端的使用
  3. [Leetcode] 58. 最后一个单词的长度
  4. 微信小程序实现点击拍照以及长按录像功能
  5. 数据分析实例-平安银行股票分析
  6. 蓝桥杯刷题冲刺 | 倒计时19天
  7. 全家桶10大软件PS/AE/AI/PR/CAD/AU/CDR/C4D/3DMAX/UG自学视频教程合集
  8. Java高级阶段技术总结
  9. Gson转换字符串为对象慢的问题
  10. 国内第一本全面讲解微软ERP主流产品Dynamics AX 2009的中文技术图书