HDFS HA高可用

目录
一.HA概述
二. HDFS-HA工作机制
    2.1 HDFS-HA工作要点
    2.2 HDFS-HA自动故障转移工作机制
三. HDFS-HA集群配置
    3.1 环境准备
    3.2 规划集群
    3.3 配置Zookeeper集群
    3.4 配置HDFS-HA集群
    3.5 启动HDFS-HA集群
    3.6 配置HDFS-HA自动故障转移
四 YARN-HA配置
    4.1 YARN-HA工作机制
    4.2 配置YARN-HA集群
五 HDFS Federation架构设计
    1.NameNode架构的局限性
    2.HDFS Federation架构设计
    3.HDFS Federation应用思考

一.HA概述

1.所谓HA(2high available),即高可用(7*24小时不中断服务)

2.实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。

3.Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)

4.NameNode主要在以下两个方面影响HDFS集群
    NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启
    NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用
    HDFS HA功能通过配置Active/Standby两个nameNodes实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。

二. HDFS-HA工作机制

1.通过双namenode消除单点故障

2.1 HDFS-HA工作要点

1.元数据管理方式需要改变:
  • 内存中各自保存一份元数据;
  • Edits日志只有Active状态的namenode节点可以做写操作;
  • 两个namenode都可以读取edits;
  • 共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现)
2.需要一个状态管理功能模块

实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在namenode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain split现象的发生。

3.必须保证两个NameNode之间能够ssh无密码登录。
4.隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务

2.2 HDFS-HA自动故障转移工作机制

    可以使用命令hdfs haadmin -failover手动进行故障转移,在该模式下,即使现役NameNode已经失效,系统也不会自动从现役NameNode转移到待机NameNode。自动故障转移为HDFS部署增加了两个新组件:ZooKeeper和ZKFailoverController(ZKFC)进程。

(1)ZooKeeper是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。HA的自动故障转移依赖于ZooKeeper的以下功能:

  • (a)故障检测:集群中的每个NameNode在ZooKeeper中维护了一个持久会话,如果机器崩溃,ZooKeeper中的会话将终止,ZooKeeper通知另一个NameNode需要触发故障转移。
  • (b)现役NameNode选择:ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为active状态。如果目前现役NameNode崩溃,另一个节点可能从ZooKeeper获得特殊的排外锁以表明它应该成为现役NameNode。

(2)ZKFC是自动故障转移中的另一个新组件,是ZooKeeper的客户端,也监视和管理NameNode的状态。每个运行NameNode的主机也运行了一个ZKFC进程,ZKFC负责:

  • (a)健康监测:ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode,只要该NameNode及时地回复健康状态,ZKFC认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。
  • (b)ZooKeeper会话管理:当本地NameNode是健康的,ZKFC保持一个在ZooKeeper中打开的会话。如果本地NameNode处于active状态,ZKFC也保持一个特殊的znode锁,该锁使用了ZooKeeper对短暂节点的支持,如果会话终止,锁节点将自动删除。
  • (c)基于ZooKeeper的选择:如果本地NameNode是健康的,且ZKFC发现没有其它的节点当前持有znode锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地NameNode为active。故障转移进程与前面描述的手动故障转移相似,首先如果必要保护之前的现役NameNode,然后本地NameNode转换为active状态。


    HDFS-HA故障转移机制

三. HDFS-HA集群配置

3.1 环境准备

(1)修改IP
(2)修改主机名及主机名和IP地址的映射
(3)关闭防火墙
(4)ssh免密登录
(5)安装JDK,配置环境变量等

3.2 规划集群
hadoop1 hadoop2 hadoop3
NameNode NameNode
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
ZK ZK ZK
ResourceManager
NodeManager NodeManager NodeManager
3.3 配置Zookeeper集群
0.集群规划

在hadoop1、hadoop2和hadoop3三个节点上部署Zookeeper。

1.解压安装

(1)解压zookeeper安装包到/opt/module/目录下

tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/

(2)在/opt/module/zookeeper-3.4.10/这个目录下创建zkData

mkdir -p zkData

(3)重命名/opt/module/zookeeper-3.4.10/conf这个目录下的zoo_sample.cfg为zoo.cfg

mv zoo_sample.cfg zoo.cfg
2.配置zoo.cfg文件

(1)具体配置

dataDir=/opt/module/zookeeper-3.4.10/zkData

增加如下配置

#######################cluster##########################

server.2=bigdata111:2888:3888

server.3=bigdata112:2888:3888

server.4=bigdata113:2888:3888

(2)配置参数解读

Server.A=B:C:D。

A是一个数字,表示这个是第几号服务器;

B是这个服务器的ip地址;

C是这个服务器与集群中的Leader服务器交换信息的端口;

D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。

3.集群操作

(1)在/opt/module/zookeeper-3.4.10/zkData目录下创建一个myid的文件

touch myid

添加myid文件,注意一定要在linux里面创建,在notepad++里面很可能乱码
(2)编辑myid文件

vi myid

在文件中添加与server对应的编号:如1

(3)拷贝配置好的zookeeper到其他机器上

scp -r zookeeper-3.4.10/ root@bigdata112.itstar.com:/opt/app/
scp -r zookeeper-3.4.10/ root@bigdata113.itstar.com:/opt/app/

并分别修改myid文件中内容为2、3

(4)分别启动zookeeper
hadoop1:

bin/zkServer.sh start

hadoop2:

bin/zkServer.sh start

hadoop3:

bin/zkServer.sh start

(5)查看状态

bin/zkServer.sh status
3.4 配置HDFS-HA集群

1.官方地址:http://hadoop.apache.org/

2.在opt目录下创建一个HA文件夹

cd /opt

mkdir HA

3.将/opt/app/下的 hadoop-2.8.4拷贝到/opt/ha目录下

cp -r hadoop-2.8.4/ /opt/HA/

4.配置hadoop-env.sh

export JAVA_HOME=/opt/module/jdk1.8.0_144

5配置core-site.xml

<configuration>
    <!-- 把两个NameNode)的地址组装成一个集群mycluster -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
    </property>
    <!-- 指定hadoop运行时产生文件的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/HA/hadoop-2.8.4/data/tmp</value>
    </property>
</configuration>

6.配置hdfs-site.xml

<configuration>
       <!-- 完全分布式集群名称 -->
       <property>
              <name>dfs.nameservices</name>
              <value>mycluster</value>
       </property>
       <!-- 集群中NameNode节点都有哪些 -->
       <property>
              <name>dfs.ha.namenodes.mycluster</name>
              <value>nn1,nn2</value>
       </property>
       <!-- nn1的RPC通信地址 -->
       <property>
              <name>dfs.namenode.rpc-address.mycluster.nn1</name>
              <value>hadoop1:9000</value>
       </property>
       <!-- nn2的RPC通信地址 -->
       <property>
              <name>dfs.namenode.rpc-address.mycluster.nn2</name>
              <value>hadoop2:9000</value>
       </property>
       <!-- nn1的http通信地址 -->
       <property>
              <name>dfs.namenode.http-address.mycluster.nn1</name>
              <value>hadoop1:50070</value>
       </property>
       <!-- nn2的http通信地址 -->
       <property>
              <name>dfs.namenode.http-address.mycluster.nn2</name>
              <value>hadoop2:50070</value>
       </property>
       <!-- 指定NameNode元数据在JournalNode上的存放位置 -->
       <property>
              <name>dfs.namenode.shared.edits.dir</name>
       <value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/mycluster</value>
       </property>
       <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
       <property>
              <name>dfs.ha.fencing.methods</name>
              <value>sshfence</value>
       </property>
       <!-- 使用隔离机制时需要ssh无秘钥登录-->
       <property>
              <name>dfs.ha.fencing.ssh.private-key-files</name>
              <value>/root/.ssh/id_rsa</value>
              <!--这里主要是看自己是什么用户,我是root用户-->
       </property>
       <!-- 声明journalnode服务器存储目录-->
       <property>
              <name>dfs.journalnode.edits.dir</name>
              <value>/opt/HA/hadoop-2.8.4/data/jn</value>
       </property>
       <!-- 关闭权限检查-->
       <property>
              <name>dfs.permissions.enable</name>
              <value>false</value>
       </property>
       <!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
       <property>
            <name>dfs.client.failover.proxy.provider.mycluster</name>
            <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
       </property>
</configuration>

7.删除data和log中的文件:

cd /opt/HA/hadoop-2.8.4/

rm -rf /opt/HA/hadoop-2.8.4/data/*

rm -rf /opt/HA/hadoop-2.8.4/logs/*

8.拷贝配置好的hadoop环境到其他节点

scp -r /opt/HA/* root@hadoop2:/opt/HA/

scp -r /opt/HA/* root@hadoop3:/opt/HA/
3.5 启动HDFS-HA集群

1.在各个JournalNode节点上,输入以下命令启动journalnode服务:

sbin/hadoop-daemon.sh start journalnode

2.在[nn1]上,对其进行格式化,并启动:
hadoop1:

bin/hdfs namenode -format

sbin/hadoop-daemon.sh start namenode

3.在[nn2]上,同步nn1的元数据信息:

bin/hdfs namenode -bootstrapStandby

4.启动[nn2]:
hadoop2:

sbin/hadoop-daemon.sh start namenode
image.png

5.查看web页面显示

hadoop1
hadoop2

6.在[nn1]上,启动所有datanode

sbin/hadoop-daemons.sh start datanode

7.查看是否Active

bin/hdfs haadmin -getServiceState nn1
查看

8.将[nn1]切换为Active

bin/hdfs haadmin -transitionToActive nn1
切换
切换

9.手动切换:

bin/hdfs haadmin -transitionToStandby nn1 
bin/hdfs haadmin -transitionToActive nn2 
手动切换
3.6 配置HDFS-HA自动故障转移
1.具体配置

(1)在hdfs-site.xml中增加

<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>
image.png

(2)在core-site.xml文件中增加

<!--配置zookeeper-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
core-site.xml
2.启动

(1)关闭所有HDFS服务:

sbin/stop-dfs.sh

hadoop2:

sbin/hadoop-daemon.sh stop namenode  

(2)启动Zookeeper集群,每一台都启动zookeeper:

bin/zkServer.sh start

(3)初始化HA在Zookeeper中状态:
在hadoop1中:

bin/hdfs zkfc -formatZK

(4)启动HDFS服务:

sbin/start-dfs.sh

(5)在各个NameNode节点上启动DFSZK Failover Controller,先在哪台机器启动,哪个机器的NameNode就是Active NameNode

sbin/hadoop-daemin.sh start zkfc

(若是直接设置自动切换,DFSZK Failover Controller没有启动,则需要走这一步)

3.验证

(1)将Active NameNode进程kill

kill -9 namenode的进程id

(2)将Active NameNode机器断开网络

service network stop

四 YARN-HA配置

4.1 YARN-HA工作机制
1.官方文档:

http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html

2.YARN-HA工作机制
image.png
4.2 配置YARN-HA集群
0.环境准备

(1)修改IP
(2)修改主机名及主机名和IP地址的映射
(3)关闭防火墙
(4)ssh免密登录
(5)安装JDK,配置环境变量等
(6)配置Zookeeper集群

1.规划集群
bigdata111 bigdata112 bigdata113
NameNode NameNode
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
ZK ZK ZK
ResourceManager ResourceManager
NodeManager NodeManager NodeManager
2.具体配置

(1)yarn-site.xml

<configuration>

    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

    <!--启用resourcemanager ha-->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
 
    <!--声明两台resourcemanager的地址-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>cluster-yarn1</value>
    </property>

    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop1</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop2</value>
    </property>
 
    <!--指定zookeeper集群的地址--> 
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
    </property>

    <!--启用自动恢复--> 
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>
 
    <!--指定resourcemanager的状态信息存储在zookeeper集群--> 
    <property>
        <name>yarn.resourcemanager.store.class</name>     <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>

(2)同步更新其他节点的配置信息

3.启动hdfs

(1)在各个JournalNode节点上,输入以下命令启动journalnode服务:

sbin/hadoop-daemon.sh start journalnode

(2)在[nn1]上,对其进行格式化,并启动:

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

(3)在[nn2]上,同步nn1的元数据信息:

bin/hdfs namenode -bootstrapStandby

(4)启动[nn2]:

sbin/hadoop-daemon.sh start namenode

(5)启动所有datanode

sbin/hadoop-daemons.sh start datanode

(6)将[nn1]切换为Active

bin/hdfs haadmin -transitionToActive nn1
4.启动yarn

(1)在hadoop1中执行:

sbin/start-yarn.sh

(2)在hadoop2中执行:

sbin/yarn-daemon.sh start resourcemanager

(3)查看服务状态

bin/yarn rmadmin -getServiceState rm1
image.png

(4)强制切换状态:

bin/yarn rmadmin -transitionToStandby rm2 --forcemanual

(5)关于sbin/start.all.sh
hadoop1:

sbin/start.all.sh

五 HDFS Federation架构设计

1.NameNode架构的局限性

(1)Namespace(命名空间)的限制
由于NameNode在内存中存储所有的元数据(metadata),因此单个namenode所能存储的对象(文件+块)数目受到namenode所在JVM的heap size的限制。50G的heap能够存储20亿(200million)个对象,这20亿个对象支持4000个datanode,12PB的存储(假设文件平均大小为40MB)。随着数据的飞速增长,存储的需求也随之增长。单个datanode从4T增长到36T,集群的尺寸增长到8000个datanode。存储的需求从12PB增长到大于100PB。

(2)隔离问题
由于HDFS仅有一个namenode,无法隔离各个程序,因此HDFS上的一个实验程序就很有可能影响整个HDFS上运行的程序。

(3)性能的瓶颈
由于是单个namenode的HDFS架构,因此整个HDFS文件系统的吞吐量受限于单个namenode的吞吐量。

2.HDFS Federation架构设计

能不能有多个NameNode

NameNode NameNode NameNode
元数据 元数据 元数据
Log machine 电商数据/话单数据
image.png
3.HDFS Federation应用思考

不同应用可以使用不同NameNode进行数据管理
图片业务、爬虫业务、日志审计业务
Hadoop生态系统中,不同的框架使用不同的namenode进行管理namespace。(隔离性)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容