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现象的发生
上述过程的图示:
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目录下,结构目录如下:
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结点信息
如下图:
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,页面显示结果如下图:
表示此时node1状态为standby,为备用namenode结点,再访问http://node2:50070,
node2的状态为active,说明此时node2为工作状态的namenode,
此时若node2的namenode进程发生故障,则node1会被激活,将正式成为工作状态的namenode.
这里我们就直接杀死node2的namenode进程来模仿故障,
再次访问http://node2:50070,
再访问http://node1:50070,
node1已被激活,成功接管namenode工作,实现单点故障转移.
可再到node2结点上进入hadoop-2.6.5/sbin/目录下,执行
./hadoop-daemon.sh start namenode
再次启动node2,作为namenode备用结点