一、概念与HA思路

1. 首先Hadoop架构为主从架构(NameNode/DataNode)
2. NameNode管理着文件系统和与维护客户端访问DataNode
3. Hadoop 2.0 之前的版本,集群中NameNode存在单点故障(SPOF)
4. 单个NameNode机器宕机将导致集群无法使用,直到管理员重启
5. 单个NameNode机器升级时也会导致集群无法使用
6. HDFS HA用于解决单节点故障(使用Active/Standby两个NameNode交替)
   方案一:借助质量好的机器进行读写操作保证日志数据一致
   方案二:使用类似与Zookeeper(2n+1特效) 备份日志数据(保证日志数据的安全性),两个NameNode共同管理一份元数据
   方案三:使用Zookeeper
7. 使用方案二,日志交于JournalNode进程管理,日志节点为奇数个
   AvtiveNameNode启动时接收DataNode心跳汇报,StandbyNameNode也需要
   使用JournalNode至少需要3个节点
8. 既然ActiveNameNode有可能会宕掉,那么客户端如何去找到StandbyNameNode
   这其中有一个Proxy(代理)用于告知客户端
9. ActiveNameNode与StandbyNameNode通过隔离机制互不干预
   通过代理找到ActiveNameNode,通过Zookeeper选主操作转移故障
10.既然ResourceManager也是一个分布式的系统,同样也可能出现单节点故障

二、部署与搭建测试

  1. 目录规划(hdfs存储位置,JournalNode存储位置,等)
  2. 上传并解压Hadoop
  3. 配置自定义(这仅仅配置HDFS NameNode HA)

*.env
# 配置JDK路径
hdfs-site.xml
# 服务配置
dfs.nameservices-->ns1
dfs.ha.namenodes.ns1-->nn1,nn2
dfs.namenode.rpc-address.ns1.nn1-->hadoop09-linux-01.ibeifeng.com:8020
dfs.namenode.rpc-address.ns1.nn2-->hadoop09-linux-02.ibeifeng.com:8020
dfs.namenode.http-address.ns1.nn1-->hadoop09-linux-01.ibeifeng.com:50070
dfs.namenode.http-address.ns1.nn2-->hadoop09-linux-02.ibeifeng.com:50070
# JournalNode存储配置(注意新建自定义目录)
dfs.namenode.shared.edits.dir-->qjournal://hadoop09-linux-01.ibeifeng.com:8485;hadoop09-linux-02.ibeifeng.com:8485;hadoop09-linux-03.ibeifeng.com:8485/ns1
dfs.journalnode.edits.dir-->/home/liuwl/opt/app/hadoop-2.5.0/data/dfs/jn
# 隔离机制
dfs.ha.fencing.methods-->sshfence
# 注意测试那几个节点是否能够连通 ssh hadoop09-linux-01.ibeifeng.com
dfs.ha.fencing.ssh.private-key-files-->/home/liuwl/.ssh/id_rsa
# 访问文件系统权限
dfs.permissions.enabled-->false
core-site.xml
fs.defaultFS-->hdfs://ns1
hadoop.tmp.dir-->/home/liuwl/opt/app/hadoop-2.5.0/data/tmp
hadoop.http.staticuser.user-->liuwl
slaves
hadoop09-linux-01.ibeifeng.com
hadoop09-linux-02.ibeifeng.com
hadoop09-linux-03.ibeifeng.com

  4. 分发配置文件目录(注意刚才新建的data/dfs/jn,其他节点也要保持一致)

scp -r hadoop/ liuwl@hadoop09-linux-02.ibeifeng.com:/home/liuwl/opt/app/hadoop-2.5.0/etc
scp -r hadoop/ liuwl@hadoop09-linux-03.ibeifeng.com:/home/liuwl/opt/app/hadoop-2.5.0/etc

  5. 分别启动Zookeeper(转13步)

bin/zkServer start

  6. 分别启动JournalNode服务

sbin/hadoop-daemon.sh start journalnode

  7. 在nn1所在节点进行格式化文件系统,并启动

bin/hdfs dfs namenode -format
sbin/hadoop-daemon.sh start namenode

  8. 在nn2所在节点进行同步元数据信息,并启动

bin/hdfs namenode -bootstrapStandby
sbin/hadoop-daemon.sh start namenode

  9. 将nn1切换为Active(手动切换)

bin/hdfs haadmin -transitionToActive nn1

  10. 在nn1所在节点启动所有datanode

sbin/hadoop-daemon.sh start datanode

  11. kill掉nn1上的namenode,并手动设置nn2为Active

nn1: kill -9 xxx/sbin/hadoop-daemon.sh stop namenode
nn2: bin/hdfs haadmin -transitionToActive nn2 --forceactive

  12. 网页上查看namenode状态或使用命令

bin/hdfs haadmin -getServiceState nn2

  13. 使用Zookeeper自动转移故障

hdfs-site.xml
dfs.ha.automatic-failover.enabled-->false
core-site.xml
ha.zookeeper.quorum-->hadoop09-linux-01.ibeifeng.com:2181,hadoop09-linux-02.ibeifeng.com:2181,hadoop09-linux-03.ibeifeng.com:2181

  14. 按照官方文档,需要初始化Zookeeper,注意每个节点上的Zookeeper服务为开启状态(转13步)

bin/hdfs zkfc -formatZK
# 单独启动zookeeper的故障转移监控器(DFSZKFailoverController),每个namenode都有一个
sbin/hadoop-deamon.sh start zkfc

  15. 测试Zookeeper存储

../zookeeper-3.4.6/bin/zkCli.sh

  16. 启动yarn,上传一个wc.input,节点三运行MR程序,运行时,kill掉ActiveNameNode

sbin/start-yarn.sh
bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount tmp/mapreduce/wordcount/input tmp/mapreduce/wordcount/output
kill -9 xxx
# 查看namenode状态
# 分析结论:DFSZKFailoverController监控NameNode状态,NameNode宕掉,监听器马上告诉Zookeeper,
# Zookeeper告知Standby的DFSZKFailoverController,进入切换Active流程
# DFSZKFailoverController进行选主操作,
# 确保新的Active节点,然后通过RPC将StandbyNameNode切换为ActiveNameNode,完成故障转移
# HA 解决了元数据共享,Active切换,隔离,并保证了元数据的安全性

  17. ResourceManager HA (支持一个ActiveResourceManager对应多个StandbyResourceManager)

yarn-site.xml
# 运行MapRedue程序必配
yarn.nodemanager.aux-services-->mapreduce_shuffle
# 配置日志聚集功能
# 日志聚集是YARN提供的日志中央化管理功能,
# 它能将运行完成的Container/任务日志上传到HDFS上,
# 从而减轻NodeManager负载,且提供一个中央化存储和分析机制,
# 默认情况下,Container/任务日志是存在各个NodeManager上的
yarn.log-aggregation-enable-->true
# 在HDFS上聚集的日志最多保存多长时间
yarn.log-aggregation.retain-seconds-->604800
# 使用ResourceManager HA
yarn.resourcemanager.ha.enabled-->true
# 添加一个ResourceManager集群ID
yarn.resourcemanager.cluster-id-->yarn-cluster
# 指定两个ResouceManager
yarn.resourcemanager.ha.rm-ids-->rm109,rm110
# 指定ResourceManager所在机器
yarn.resourcemanager.hostname.rm109-->hadoop09-linux-02.ibeifeng.com
yarn.resourcemanager.hostname.rm110-->hadoop09-linux-03.ibeifeng.com
# 配置Zookeeper机器地址
yarn.resourcemanager.zk-address-->hadoop09-linux-01.ibeifeng.com:2181,hadoop09-linux-02.ibeifeng.com:2181,hadoop09-linux-03.ibeifeng.com:2181
# ResourceManager恢复
yarn.resourcemanager.recovery.enabled-->true
# 修改ResourceManager默认存储日志的方式
yarn.resourcemanager.store.class-->org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
# 分发到各个节点

  18. 分别启动(之前先启动Zookeeper)

节点1:sbin/start-dfs.sh
节点1:sbin/start-yarn.sh
节点1:sbin/start-yarn.sh

  19. 打开web查看各类信息,当使用节点3打开resourcemanager,发现它会自动重定向到节点2
  20. 节点1测试一个mr程序,断掉节点2的ResourceManager,查看web

bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount tmp/mapreduce/wordcount/input tmp/mapreduce/wordcount/output2
kill -9 xx
# 当kill节点2的ResourceManager的一瞬间,节点报错(连接超时)
# java.io.IOException: Failed on local exception: java.io.EOFException; Host Details : local host is: "hadoop09-linux-01.ibeifeng.com/10.0.0.108"; destination host is: "hadoop09-linux-02.ibeifeng.com":8032;
# 打开节点3的web页面发现该程序仍在运行,即由节点3的ResoreceManager接管执行mr程序
# 过了几十秒后mr程序成功运行完毕
# 内部已设置一个监控器,所以可以自动切换

  21. 进入Zookeeper客户端查看

../zookeeper-3.4.6/bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls /
[rmstore, yarn-leader-election, hadoop-ha, zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /rmstore
[ZKRMStateRoot]
[zk: localhost:2181(CONNECTED) 2] ls /rmstore/ZKRMStateRoot
[RMAppRoot, RMVersionNode, RMDTSecretManagerRoot]

Hadoop.2.x_HA部署的更多相关文章

  1. Hadoop大数据部署

    Hadoop大数据部署 一. 系统环境配置: 1. 关闭防火墙,selinux 关闭防火墙: systemctl stop firewalld systemctl disable firewalld ...

  2. Hadoop生态圈-Oozie部署实战

    Hadoop生态圈-Oozie部署实战 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Oozie简介 1>.什么是Oozie Oozie英文翻译为:驯象人.一个基于工作流 ...

  3. Hadoop.之.入门部署

    一.课程目标 ->大数据是什么?大数据能做什么? ->什么是Hadoop?Hadoop的设计思想? ->Hadoop如何解决大数据的问题?(什么是hdfs与yarn.MapReduc ...

  4. Hadoop生态圈-Azkaban部署实战

    Hadoop生态圈-Azkaban部署实战 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.Azkaban部署流程 1>.上传azkaban程序并创建解压目录 [yinz ...

  5. Hadoop系列之(二):Hadoop集群部署

    1. Hadoop集群介绍 Hadoop集群部署,就是以Cluster mode方式进行部署. Hadoop的节点构成如下: HDFS daemon:  NameNode, SecondaryName ...

  6. Hadoop生态圈-Sqoop部署以及基本使用方法

    Hadoop生态圈-Sqoop部署以及基本使用方法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与 ...

  7. hadoop 集群部署ganglia 监控服务与nagios 报警服务

      1. 部署ganglia 服务   ganglia 涉及到的组件:     数据监测节点(gmond):这个部件装在需要监测的节点上,用于收集本节点的运行情况,并将这些统计信息传送到gmetad, ...

  8. ubuntu下hadoop完全分布式部署

    三台机器分别命名为: hadoop-master ip:192.168.0.25 hadoop-slave1 ip:192.168.0.26 hadoop-slave2 ip:192.168.0.27 ...

  9. Hadoop系列(二):Hadoop单节点部署

    环境:CentOS 7 JDK: 1.7.0_80 hadoop:2.8.5 hadoop(192.168.56.101) 配置基础环境 1. 测试环境可以直接关闭selinux和防火墙 2. 主机添 ...

随机推荐

  1. VS2012 OpenCV2.4.9 Debug可以允许,Release不可以

    一个简单的程序 #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgu ...

  2. 在Salesforce中通过编写C#程序调用dataloadercliq的bat文件取触发调用data loader来批量处理数据

    通过这篇文章 http://www.cnblogs.com/mingmingruyuedlut/p/3413903.html 我们已经知道了Data Loader可以对Salesforce的Objec ...

  3. wpf window set window的owner

        [DllImport("user32.dll")]   public static extern IntPtr GetAncestor(IntPtr hWnd, int f ...

  4. Java学习笔记(十)——多态

    一.多态 1.对象的多种形态 (1)引用多态: 父类的引用可以指向本类的对象 父类的引用可以指向子类的对象 (2)方法多态: 创建本类对象时,调用的方法为本类方法: 创建子类对象时,调用的方法是子类方 ...

  5. Android 蹲坑的疑难杂症集锦一

    各位看官老爷子你们好,我就是那个挖坑不埋,还喜欢开新矿的小喵同志. 问大家一个问题,在Github上找项目的时候,看到中文简介说明你们是不是觉得这个项目很low不屑一顾? 最近朋友无意中说,在Gith ...

  6. DLL中传递STL参数(如Vector或者list等)会遇到的问题[转载]

    最近的一个项目中遇到了调用别人的sdk接口(dll库)而传给我的是一个vector指针,用完之后还要我来删除的情况.这个过程中首先就是在我的exe中将其vector指针转为相应指针再获取vector中 ...

  7. 2016.8.16 JQuery学习记录

    1.$(document).ready(function(){}); 这个函数会在浏览器加载完页面之后,尽快执行: 2.所有的JQuery函数用有个$开始表示,All jQuery functions ...

  8. FastMM 定位内存泄露的代码位置

    FastMM 定位内存泄露的代码位置 开源的FastMM,使用很简单,在工程的第一行引用FastMM4即可(注意,一定要在第一个Uses的位置),可以在调试程序时提示内存泄露情况,还可以生成报告. 在 ...

  9. JetS3t使用说明

    http://blog.csdn.net/hitmediaman/article/details/6636402

  10. Glow Android 优化实践

    了解 Glow 的朋友应该知道,我们主营四款 App,分别是Eve.Glow.Nuture和Baby.作为创业公司,我们的四款 App 都处于高速开发中,平均每个 Android App 由两人负责开 ...