1)hadoop-ha集群运作机制介绍
所谓HA,即高可用(7*24小时不中断服务)
实现高可用最关键的是消除单点故障
hadoop-ha严格来说应该分成各个组件的HA机制

2)HDFS的HA机制
通过双namenode消除单点故障
双namenode协调工作的要点:
A、元数据管理方式需要改变:
内存中各自保存一份元数据
Edits日志只能有一份,只有Active状态的namenode节点可以做写操作
两个namenode都可以读取edits
共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现)
B、需要一个状态管理功能模块
实现了一个zkfailover,常驻在每一个namenode所在的节点
每一个zkfailover负责监控自己所在的namenode节点,利用zk进行状态标识
当需要进行状态切换时,由zkfailover来负责切换
切换时需要防止brain split现象的发生

上述过程的图示:

HADOOP集群搭建原理_单点故障

3)HA集群搭建

搭建环境:CentOS release 6.5 (Final) + jdk1.8.0_131
这里使用三台服务器来搭建,分别为node1、node2、node3;
对应的ip为:192.168.1.11、192.168.1.12、192.168.1.13


1.主机名称与IP地址的映射配置

HDFS集群中具有两个关键的角色:namenode和datanode。集群中所有的结点作为一个整体对分布式应用提供服务,集群中每个结点都与namenode结点相连接,所以,在配置的hdfs集群的时候,每一个结点的host到IP地址的映射都要配置上集群中其它结点的映射信息,方便结点之间的相互通信。
以node1为例:

vi /etc/hosts

进入配置文件hosts,配置对应映射

192.168.1.11 node1
192.168.1.12 node2
192.168.1.13 node3

2.关闭防火墙

//关闭防火墙
service iptables stop 
// 防火墙开机不自动启动 
chkconfig iptables off

3.安装Hadoop

我这里下载的是hadoop-2.6.5.tar.gz,执行

tar -zxvf hadoop-2.6.5.tar.gz -C /home/hadoop/app/

解压到/home/hadoop/app目录下,结构目录如下:

HADOOP集群搭建原理_namenode_02

bin              #可执行文件(hadoop的功能操作命令)
etc              #配置文件
include    
lib              #本地库文件(数据压缩编解码、本地文件系统操作)
libexec    
LICENSE.txt
NOTICE.txt 
README.txt
sbin                #可执行文件(hadoop集群进程管理的操作命令)
share           #开发所需要的jar包及用户帮助文档

4.修改配置文件

进入etc/hadoop/目录下

cd hadoop-2.6.5/etc/hadoop/

Hadoop集群需要修改的配置文件总共为6个,分别是

(1)hadoop-env.sh #配置jdk环境
(2)core-site.xml #配置Hadoop相关服务
(3)hdfs-site.xml #配置hdfs系统信息
(4) mapred-site.xml #配置mapreduce相关信息
(5)yarn-site.xml #配置yarn平台信息
(6)slaves #配置DataNode结点信息

如下图:

HADOOP集群搭建原理_单点故障_03

4.1 修改hadoop-env.sh 文件

//指定jdk
JAVA_HOME = /home/hadoop/app/jdk1.8.0_131

4.2 修改core-site.xml文件,配置hdfs系统

<configuration>
<!-- 指定hdfs的nameservice为ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1/</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/app/hadoop-2.6.5/tmp</value>
</property>

<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>

4.3 修改hdfs-site.xml文件

<configuration>
<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
<property>
    <name>dfs.nameservices</name>
    <value>ns1</value>
</property>
<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
<property>
    <name>dfs.ha.namenodes.ns1</name>
    <value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
    <name>dfs.namenode.rpc-address.ns1.nn1</name>
    <value>node1:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
    <name>dfs.namenode.http-address.ns1.nn1</name>
    <value>node1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
    <name>dfs.namenode.rpc-address.ns1.nn2</name>
    <value>node2:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
    <name>dfs.namenode.http-address.ns1.nn2</name>
    <value>node2:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://node1:8485;node2:8485;node3:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/home/hadoop/app/hadoop-2.6.5/journaldata</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
    <name>dfs.client.failover.proxy.provider.ns1</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>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>10000</value>
</property>
<!-- 配置复本数量,默认为3 -->
<property>  
  <name>dfs.replication</name>  
  <value>2</value>  
</property>  
</configuration>

4.4 修改mapred-site.xml文件

<!-- 指定为yarn平台运行mapreduce -->
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

4.5 修改yarn-site.xml文件,配置yarn-ha机制

<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 开启RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node2</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
<!-- 指定shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

4.6修改slaves文件,配置DataNode结点

node1
node2
node3

5.复制分发Hadoop包至node2和node3

将配置文件修改好后,进入/app目录,执行

//复制分发到node2
scp -r  hadoop-2.6.5 node2:/home/hadoop/app
//复制分发到node3
scp -r  hadoop-2.6.5 node3:/home/hadoop/app

6.配置Hadoop环境变量

配置方法与配置JAVA_HOME相同,参见Linux下JAVA_HOME配置

7.启动Hadoop-HA集群

注意:严格按照下面的步骤启动

  • 7.1 启动zookeeper集群
    zookeeper集群的搭建,参考 ZooKeeper-3.4.6分布式集群安装,启动zookeeper集群.
  • 7.2 手动启动 journalnode
    分别进入各结点的hadoop-2.6.5/sbin/目录下,执行
//启动 journalnode
 ./hadoop-daemon.sh start journalnode
  • 7.3 格式化HDFS
    只在node1上执行:
hdfs namenode -format
//将格式化生成的集群id文件(tmp文件夹)复制到备用namenode上:  
scp -r tmp/ node2:/home/hadoop/app/hadoop-2.6.0
  • 7.4格式化ZKFC
    只在node1上执行:
hdfs zkfc -formatZK
  • 7.5 启动hdfs和yarn平台
//启动hdfs
start-hdfs.sh
//启动yarn平台
start-yarn.sh
//或者:直接启动hdfs+yarn服务: 
sbin/start-all.sh

4)登录web浏览器查看
使用web浏览器访问http://node1:50070,页面显示结果如下图:

HADOOP集群搭建原理_HADOOP集群搭建原理_04

表示此时node1状态为standby,为备用namenode结点,再访问http://node2:50070,

HADOOP集群搭建原理_单点故障_05

node2的状态为active,说明此时node2为工作状态的namenode,
此时若node2的namenode进程发生故障,则node1会被激活,将正式成为工作状态的namenode.
这里我们就直接杀死node2的namenode进程来模仿故障,

HADOOP集群搭建原理_Hadoop-HA_06

再次访问http://node2:50070,

HADOOP集群搭建原理_单点故障_07

再访问http://node1:50070,

HADOOP集群搭建原理_namenode_08

node1已被激活,成功接管namenode工作,实现单点故障转移.
可再到node2结点上进入hadoop-2.6.5/sbin/目录下,执行

./hadoop-daemon.sh start namenode

再次启动node2,作为namenode备用结点