1、背景介绍

Hadoop2.0.0之前,在一个HDFS集群中,NameNode存在单节点故障(SPOF):因为集群中只有一个NameNode,所以在使用过程中,如果该NameNode出现故障或数据丢失,那么整个集群将瘫痪,故障NameNode节点故障无法恢复,将导致整个集群不能恢复,这也是Hadoop2.0.0之前版本不可靠的表现。

为了解决hadoop2.0.0之前的单点问题,在hadoop2通过在同一个集群上运行两个NameNode的主动/被动配置热备份,这样集群允许在一个NameNode出现故障时转移到另外一个NameNode来保证集群的正常运。两个NameNode有相同的职能。在任何时候,一个是active状态的,一个是standby状态的。当集群运行时,只有active状态的NameNode是正常工作的,standby状态的NameNode是处于待命状态的,时刻同步active状态NameNode的数据。一旦active状态的NameNode不能工作,通过手工或者自动切换,standby状态的NameNode就可以转变为active状态的,就可以继续工作了,这就是高可靠。

2、体系结构

在一个典型的HA集群中,需要选择两台单独的机器作为NameNode,并且在任何时候,一个NameNode处于活跃状态,另外一个则处于备用状态;活跃的NameNode负责集群中所有客户端操作,备用节点作为从节点,在活跃节点故障时提供一个快速的故障转移。 
为了备用节点能够与活跃节点保持同步,两个节点之间增加了一个守护进程“JournalNodes”(JNS),当任何namespace被活动节点所修改,JNS都会记录edits及相应的操作日志,备用节点会从JNS上读取edits,并将edits中所记录操作应用在自己的namespace,在发生故障时,备用节点将能确保在自己成为活动节点之前通过JNS读取了所有的edits,从而确保namespace在故障转移前是完全同步的。 
为了提供一个快速的故障转移,备用节点有必要保存最新的集群中数据块的位置,为了实现这一目的,datanode配置了两个namenode,并给两个namenode发送块的信息及心跳。 
需要确保集群中有且仅有一个namenode是活跃的,否则,两个namenode之间的分歧很可能造成数据丢失或其他错误;为了防止该问题的出现,JNS只允许一个namenode(即 active node)存在写权限,在故障转移期间,新的活跃的namenode将接管写权限,这将有效地防止其他NameNode持续处于活跃状态,并允许新的活动节点安全的进行故障转移。

3、环境介绍

linux系统:CentOS 7.0 (64位)
内存:8G
Hadoop版本:2.7.3

4、Hadoop集群结构说明

4.1 集群结构

IP 主机名 Hadoop角色 Hadoop jps结果
192.168.248.205 hadoop01 master NameNode/ResourceManager/DFSZKFailoverController
192.168.248.206 hadoop02   NameNode/DFSZKFailoverController
192.168.248.207 hadoop03 slaves DataNode/JournalNode/NodeManager
192.168.248.208 hadoop04 slaves DataNode/JournalNode/NodeManager
192.168.248.209 hadoop05 slaves DataNode/JournalNode/NodeManager

4.2 hosts文件配置

$ vi /etc/hosts
192.168.248.205 hadoop01
192.168
.248.206 hadoop02
...
192.168.248.209 hadoop05

5、Hadoop集群配置

Hadoop需要通过SSH来启动Slave列表中主机的Hadoop守护进程,对于分布式,Hadoop会依次启动$HADOOP_HOME/etc/hadoop/savles文件中配置的主机进程。

5.1、配置SSH免密码登录(略),安装配置zookeeper略。

5.2、Hadoop分布式集群配置:

Hadoop的分布式安装过程非常简单,只需要将Hadoop安装包解压到指定的目录就可以了,接下来对Hadoop的主要配置文件进行配置。

将Hadoop安装包解压到/usr/hadoop 目录下:

然后针对/usr/hadoop/hadoop-2.7.3/etc/hadoop目录下几个主要文件进行配置: 
hadoop-env.sh、yarn-env.sh 、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、slaves

5.2.1、配置hadoop-env.sh

编辑hadoop-env.sh,找到JAVA_HOME指定JDK的安装配置

$vi hadoop-env.sh
export JAVA_HOME=/opt/jdk1.8

5.2.2、配置yarn-env.sh

编辑yarn-env.sh,找到JAVA_HOME指定JDK的安装配置

 $vi yarn-env.sh

 export JAVA_HOME=/opt/jdk1.8

5.2.3、配置core-site.xml

$vi core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration>
<!-- 指定hdfs的nameservice为cluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster</value>
</property>
<!-- 指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>192.168.248.205:2181,192.168.248.206:2181,192.168.248.207:2181,192.168.248.208:2181,192.168.248.209:2181</value>
</property>
<property>
<name>ha.zookeeper.session-timeout.ms</name>
<value>60000</value>
</property>
<!-- 故障检查时间 -->
<property>
<name>ha.failover-controller.cli-check.rpc-timeout.ms</name>
<value>60000</value>
</property>
<!-- ipc通讯超时时间 -->
<property>
<name>ipc.client.connect.timeout</name>
<value>20000</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/hadoop/tmp</value>
</property>
</configuration>

5.2.4、配置hdfs-site.xml

Hadoop中的HDFS配置,主要配置备份方式,及NameNode、DataNode、NameSecondary存储地址。 
$vi hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration>
<!--指定hdfs的nameservice为cluster,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>cluster</value>
</property>
<!-- cluster下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.cluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1、nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.cluster.nn1</name>
<value>192.168.248.205:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster.nn2</name>
<value>192.168.248.206:9000</value>
</property>
<!-- nn1、nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.cluster.nn1</name>
<value>192.168.248.205:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.cluster.nn2</name>
<value>192.168.248.206:50070</value>
</property> <property>
<name>dfs.namenode.servicerpc-address.cluster.nn1</name>
<value>192.168.248.205:53310</value>
</property>
<property>
<name>dfs.namenode.servicerpc-address.cluster.nn2</name>
<value>192.168.248.206:53310</value>
</property> <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://192.168.248.207:8485;192.168.248.208:8485;192.168.248.209:8485/cluster</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/hadoop/hdfs/journal/data</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property> <!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property> <property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.image.transfer.bandwidthPerSec</name>
<value>1048576</value>
</property> <property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.name.dir</name>
<value>file:/usr/hadoop/hdfs/data</value>
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file:/usr/hadoop/hdfs/namesecondary</value>
</property>
</configuration>

5.2.5、配置mapred-site.xml

Hadoop的MapReduce框架配置,配置MapReduce框架名称 
$vi mapred-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

5.2.6、配置yarn-site.xml

$vi yarn-site.xml

<?xml version="1.0"?>
<configuration> <property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>192.168.248.205</value>
</property> </configuration>

5.2.7、配置slaves节点列表

对于分布式安装,该文件中需要配置从节点机器名。

$vi slaves
192.168.248.207
192.168.248.208
192.168.248.209

(注解:slaves节点配置列表,伪分布式配置为:localhost)

到此,整个Hadoop伪分布式安装完毕,接下来就可以格式HDFS文件系统,并启动Hadoop系统。(将以上这些配置文件同步到其他所有主机)

5.3、启动集群

5.3.1、启动zookeeper集群(略)

5.3.2、启动journal node(在hadoop03、04、05)

./sbin/hadoop-daemon.sh start journalnode

执行jps命令,可以查看到JournalNode的Java进程pid;

5.3.3、格式化HDFS(namenode)第一次要格式化(在hadoop01、02中任意一台,我选择hadoop01)(这里直接复制会有问题,最好手动输入)

./bin/hdfs namenode –format

5.3.4、格式化zk(在hadoop01即可)(这里直接复杂会有问题,最好手动输入)

./bin/hdfs zkfc –formatZK

格式成功后,查看zookeeper中可以看到

[zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha
[cluster]

 5.3.5、启动zkfc来监控NN状态(在hadoop01、02)

./sbin/hadoop-daemon.sh start zkfc

5.3.6、启动HDFS(namenode)(在hadoop01即可)

./sbin/start-dfs.sh

 #把NameNode的数据同步到hadoop02上(在hadoop02上执行)
$ hdfs namenode –bootstrapStandby
#启动mhadoop02上的namenode作为standby
$ sbin/hadoop-daemon.sh start namenode

   5.3.8、启动YARN

在hadoop01上执行如下命令

启动YARN(MR)(在192.168.248.205即可)

6、测试HA

正常启动后hadoop01的namenode与hadoop02的namenode状态截图如下: 

 
此时在hadoop01上执行如下命令关闭namenode

$ sbin/hadoop-daemon.sh stop namenode

再次查看hadoop02上的namenode,发现自动切换为active了,结果如下: 

 
 

Hadoop2.7.3 HA高可靠性集群搭建的更多相关文章

  1. Hadoop HA高可用集群搭建(Hadoop+Zookeeper+HBase)

    声明:作者原创,转载注明出处. 作者:帅气陈吃苹果 一.服务器环境 主机名 IP 用户名 密码 安装目录 master188 192.168.29.188 hadoop hadoop /home/ha ...

  2. Hadoop 3.1.2(HA)+Zookeeper3.4.13+Hbase1.4.9(HA)+Hive2.3.4+Spark2.4.0(HA)高可用集群搭建

    目录 目录 1.前言 1.1.什么是 Hadoop? 1.1.1.什么是 YARN? 1.2.什么是 Zookeeper? 1.3.什么是 Hbase? 1.4.什么是 Hive 1.5.什么是 Sp ...

  3. Hadoop HA高可用集群搭建(2.7.2)

    1.集群规划: 主机名        IP                安装的软件                            执行的进程 drguo1  192.168.80.149 j ...

  4. Zookeeper(四)Hadoop HA高可用集群搭建

    一.高可就集群搭建 1.集群规划 2.集群服务器准备 (1) 修改主机名(2) 修改 IP 地址(3) 添加主机名和 IP 映射(4) 同步服务器时间(5) 关闭防火墙(6) 配置免密登录(7) 安装 ...

  5. Hadoop HA 高可用集群搭建

    一.首先配置集群信息 vi /etc/hosts 二.安装zookeeper 1.解压至/usr/hadoop/下 .tar.gz -C /usr/hadoop/ 2.进入/usr/hadoop/zo ...

  6. HDFS-HA高可用集群搭建

    HA高可用集群搭建 1.总体集群规划 在hadoop102.hadoop103和hadoop104三个节点上部署Zookeeper. hadoop102 hadoop103 hadoop104 Nam ...

  7. HA 高可用集群概述及其原理解析

    HA 高可用集群概述及其原理解析 1. 概述 1)所谓HA(High Available),即高可用(7*24小时不中断服务). 2)实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件 ...

  8. 七、Hadoop3.3.1 HA 高可用集群QJM (基于Zookeeper,NameNode高可用+Yarn高可用)

    目录 前文 Hadoop3.3.1 HA 高可用集群的搭建 QJM 的 NameNode HA Hadoop HA模式搭建(高可用) 1.集群规划 2.Zookeeper集群搭建: 3.修改Hadoo ...

  9. linux -- 基于zookeeper搭建yarn的HA高可用集群

    linux -- 基于zookeeper搭建yarn的HA高可用集群 实现方式:配置yarn-site.xml配置文件 <configuration> <property> & ...

随机推荐

  1. python文件编码说明 coding=utf-8

    python 支持3种编码声明,一般常用能见到下面两种 1.# -*- coding: utf-8 -*- 这种写法是为了兼容Emacs的编码声明 2.短一点,但Emacs不能用# coding=ut ...

  2. iconfont补遗

    一.TureTpe(.ttf)格式: .ttf字体是Windows和Mac的最常见的字体,是一种RAW格式,因此他不为网站优化,支持这种字体的浏览器有[IE9+,Firefox3.5+,Chrome4 ...

  3. 匿名内部类 Inner class

    先说结论 匿名内部类分两种,一种是接口的匿名实现,一种是类的匿名子类!后者往往用于修改特定方法. 再说起因 本来以为匿名内部类很简单,就是接口的匿名实现,直到我发现了下面这段代码: public cl ...

  4. 绑定QQ登录 PHP OAuth详解(转)

    越来越多的网站开始采用 第三方账号登录 如qq 微博 开心网 等诸多流行的社交平台,利用第三方账号登录,可以更好地省去用户的注册时间,并且极大地提高用户体验,吸引更多的潜在用户. 让用户拥有 一个号码 ...

  5. 模拟form表单请求上传文件

    发请求 public string CameraFileUpload(string url,string path,string serverPath,string uploadfileName) { ...

  6. 一老掉牙的故事、是一个阿Q还是另一道曙光

       几年前曾经看到过这个故事,当时以为自己要怎样怎样!可结果似乎不那么美好!    几年人生美好广景,几年依然碌碌无为,不沉着.不冷静.不务实.不圆滑.不老练.不勇敢.不勤劳,关键不聪明,无毅力.着 ...

  7. c#后台修改前台DOM的css属性示例代码

    <div id = 'div1' runat="server">haha</div> ----------- 后台代码中这样调用 div1.Style[&q ...

  8. C# 导出Excel "正在中止线程" 错误

    导出Excel相信很多人都用过,但是我却遇到了一个问题 “正在中止线程” 源代码如下: public static void ExportExcel(string fileName, GridView ...

  9. 系统管理模块_用户管理1_实现用户有关的功能_测试功能、解决事务的问题、对密码进行MD5摘要

    系统管理模块__用户管理1__实现用户有关的功能 了解用户管理要做什么(增删改查初始化密码) 设计实体 分析功能有几个对应几个请求 增删改查有6个请求,初始化密码一个 实现增删改查一组功能的步骤流程 ...

  10. m2014_c:C 工具库1:list

    转自:http://www.cnblogs.com/sniperHW/archive/2012/04/02/2429607.html 近来考虑将项目基础框架的开发语言从C++换成C,免不了要编写一大堆 ...