您的位置:首页 > 运维架构 > 网站架构

Hadoop 学习笔记九 HA高可用设置

2017-05-03 16:58 435 查看

一、概述

早期的hadoop版本,NN是HDFS集群的单点故障点,每个集群只有一个NN。为了解决 个问题,出现了一堆针对HDFS HA的解决方案,如:Linux HA,VMware FI,shared NAS+NFS,BookKeeper,QJM/Quorum Journal Manager,BackupNode等。

1. SPOF方案

Secondary NameNode,并非HA

Backup NameNode:在内存中复制了NN的当前状态,算是Warm Standby,并没有failover。

手动把name.dir指向NFS,这是安全的Code Standby,可以保证元数据不丢失,但集群的恢复完全靠手动

Facebook AvatarNode



其设计思想与Hadoop2.0的HA非常相似。

PrimaryNN与StandbyNN之间通过NFS来共享FsEdits、FsImage文件,这样主备NN之间就拥有了一致的目录树和block信息;而block的位置信息,可以根据DN向两个NN上报的信息过程中构建起来。这样再辅以虚IP,可以较好达到主备NN快速热切的目的。但这里的NFS又引入了新的SPOF

在主备NN共享元数据的过程中,也有方案通过主NN将FsEdits的内容通过与备NN建立的网络IO流,实时写入备NN,并且保证整个过程的原子性。这种方案,解决了NFS共享元数据引入的SPOF,但是主备NN之间的网络连接又会成为新的问题

2. hadoop2.X HA原理

Clouera提出了QJM/Qurom Journal Manager,这是基于Paxos算法实现的HDFS HA方案。



基本原理 用2N+1台JN存储EditLog,每次写操作有大多数(>=N+1)返回成功时即认为该次写成功,数据不会丢失了。这个算法能容忍的最多有N台机器挂掉。

HA架构里SecondaryNameNode不存在了,standby NN与Active NN使用JournalNode交互。

发生故障时,Active的NN挂掉,Standby NN会在成为Active NN前,读取所有的JN里的修改日志,这样能高可靠的保证与挂掉的NN的目录镜像树一致,然后无缝的接替它的职责,维护来自客户端请求,从而达到一个高可用的目的

QJM方式来实现HA的主要优势

– 不需要配置额外的高共享存储,降低了复杂度和维护成本

– 消除spof

–系统鲁棒性(Robust:健壮)的程度是可配置

–JN不会因为其中一台的延迟而影响整体的延迟,而且不会因为JN的数量增多而影响性能。(NN向JN发送日志是并行的)

客户端fencing:确保只有一个NN能响应客户端请求,让访问standby nn的客户端直接失败。在RPC层封装了一层,通过FailoverProxyProvider以重试的方式连接NN。通过若干次连接一个NN失败后尝试连接新的NN,对客户端的影响是重试的时候增加一定的延迟。客户端可以设置重试次数和时间。

Hadoop提供了ZKFailoverController角色,部署在每个NameNode的节点上,作为一个deamon进程, 简称zkfc



ZKFailoverController主要包括三个组件:

– HealthMonitor

– ActiveStatndbyElector:管理和监控自己在ZK中的状态

– ZKFailoverController:订阅HealthMonitor 和ActiveStandbyElector 的事件,并管理NameNode的状态

3.Hadoop2.x Federation:

单Active NN的架构使得HDFS在集群扩展性和性能上都有潜在的问题,当集群大到一定程度后,NN进程使用的内存可能会达到上百G,NN成为了性能的瓶颈。

Hadoop 2.x提供了HDFS Federation:



小结

Hadoop2中NameNode可以不止一个。一个是active状态,另一个是standby状态,当集群运行时,active状态的NameNode是正常工作的,standby状态的NameNode是待命状态的,时刻同步active状态NameNode的数据。

新HDFS采用一种共享机制,Quorum Journal Node(JournalNode)集群或者Nnetwork File System(NFS)进行共享。NFS是操作系统层面的,JournalNode是Hadoop层面的。主流的作法是使用JournalNode集群进行数据共享。

JournalNode架构图:



两个NameNode为了数据同步,会通过一组JournalNodes的独立进程进行相互通信。当active状态的NameNode命名空间有任何修改时,会告知大部分的JournalNodes进程。StandBy状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了。

HA确保同一时刻只有一个NameNode处于Active状态,使用ZooKeeper实现这一点。

二、HA集群的搭建

NameNode的HA

配置

core-site.xml

hdfs-site.xml

ResourceManager HA

配置

yarn-site.xml

测试环境

主机名IPNameNodeDataNodeYarnZookeeperJournalNode
master1.hadoop192.10.200.2
master2.hadoop192.10.200.3
slave1.hadoop192.10.200.4
slave2.hadoop192.10.200.5

核心配置文件

core-sites.xml

<configuration>
<!-- 指定hdfs的nameservice为ns -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!--指定hadoop数据临时存放目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/workspace/hdfs/temp</value>
</property>

<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!--指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>        <value>slave1.hadoop:2181,slave2.hadoop:2181,master2.hadoop:2181</value>
</property>
</configuration>


hdfs-site.xml

<configuration>
<!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!-- ns下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>master1.hadoop:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>slave1.hadoop:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>slave2.hadoop:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>master2.hadoop:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master1.hadoop:8485;master2.hadoop:8485/ns</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/workspace/journal</value>
</property>
<!-- 开启NameNode故障时自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</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>/home/hadoop/.ssh/id_rsa</value>
</property>

<property>
<name>dfs.namenode.name.dir</name>
<value>file:///home/hadoop/workspace/hdfs/name</value>
</property>

<property>
<name>dfs.datanode.data.dir</name>
<value>file:///home/hadoop/workspace/hdfs/data</value>
</property>

<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>


mapred-site.xml

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>


yarn-site.xml

<configuration>
<!-- 指定nodemanager启动时加载server的方式为shuffle server -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定resourcemanager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>slave1.hadoop</value>
</property>
</configuration>


查看master1 slaves

/home/hadoop/hadoop-2.7.3/etc/hadoop
cat slaves


启动zookeeper集群

在slave1 slave2 master2执行

/opt/zookeeper-3.5.2-alpha/bin/zkServer.sh start


启动journalnode集群

sbin/hadoop-damons.sh start journalnode


格式化zkfc

hdfs zkfc -formatZK
zkCli.sh -server 127.0.0.1:2181
ls /hadoop-ha


会输出[ns]

格式化hdfs

hadoop namenode -format


在master1启动namenode

./hadoop-daemon.sh start namenode


在master2同步namenode数据,同时启动standby的namenode

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


在master1上启动datanode

./hadoop-daemon.sh start datanode


启动yarn,在slave2运行

./start-yarn.sh


查看rm状态

yarn rmadmin -getServiceState rm1
active
yarn rmadmin -getServiceState rm2
standby


切换NN

hdfs haadmin -DFSHAadmin -transitionToActive master.hadoop


让rm2 active

hdfs haadmin -DFSHAadmin -failover  master.hadoop slave3.hadoop


启动zkfc,在master1运行

sbin/hadoop-daemons.sh start zkfc


参考文章:

http://www.cnblogs.com/tgzhu/p/5790565.html

http://www.open-open.com/lib/view/open1436855630959.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: