Hadoop-2.7.3高可用配置
简介
前一篇文章已经大致介绍了安装Hadoop需要的一些环境准备工作,这篇文章就来进行下原生Hadoop(完全分布式+高可用)的安装与配置。
Hadoop Namenode存在单点故障问题,Hadoop2.0版本以后可以开启两个Namenode来解决这个问题,一个为Active Namenode管理集群,一个为Standby Namenode作为热备份。
Standby Namenode节点与Active Namenode节点之间数据的同步依赖于JournalNode服务。
Zookeeper和ZKFC(ZKFailoverController)服务可以保证集群中有且只有一个Active状态的Namenode。
本文同时配置了NameNode
和Resource Manager
的高可用(HA)。
Zookeeper下载:点击进入下载Zookeeper
Hadoop下载:点击进入下载Hadoop
注:本文使用的
Zookeeper版本为3.4.10
Hadoop版本为2.7.3
Zookeeper安装与配置
需要部署奇数(2N+1)个Zookeeper服务,至少3个,3个节点应该具有相同的硬件配置。
解压
# tar -zxvf zookeeper-3.4.10.tar.gz -C /usr/hadoop/
配置环境变量
# vim /etc/profile
export ZOOKEEPER_HOME=/usr/hadoop/zookeeper-3.4.10
export PATH=$PATH:$ZOOKEEPER_HOME/bin
# source /etc/profile
配置Zookeeper
# cd /usr/hadoop/zookeeper-3.4.10/conf
# cp zoo_sample.cfg zoo.cfg
# vim zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
# 数据存放位置
dataDir=/hadoop/zookeeper/zkdata
# 日志存放位置
dataLogDir=/hadoop/zookeeper/zklog
# 端口
clientPort=2181
# 指定部署Zookeeper的三个节点
server.1=master1:2888:3888
server.2=master2:2888:3888
server.3=worker1:2888:3888
创建文件夹
# mkdir -p /hadoop/zookeeper/zkdata
# mkdir /hadoop/zookeeper/zklog
创建myid
在/hadoop/zookeeper/zkdata
下创建文件myid
编辑内容为当前server数值(1,2,3),需要与上面zoo.cfg
中的配置相对应:
master1节点 -> 1
master2节点 -> 2
worker1节点 -> 3
Hadoop安装与配置
解压
# tar -zxvf hadoop-2.7.3.tar.gz -C /usr/hadoop/
进入配置文件目录# cd /usr/hadoop/hadoop-2.7.3/etc/hadoop/
配置core-site.xml
<!-- 指定hdfs nameservice -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1/</value>
</property>
<!-- 开启垃圾回收站功能,值为检查点被删除的分钟数,设为0为禁用 -->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
<!-- 指定hadoop数据文件夹 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/hadoop/tmp</value>
</property>
<!-- 指定Zookeeper地址及端口 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>master1:2181,master2:2181,worker1:2181</value>
</property>
配置hdfs-site.xml
说明: 启用 NameNode HA的话,不再需要开启Secondary NameNode
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>master1:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>master1:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>master2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>master2:50070</value>
</property>
<!-- 指定JN节点 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master1:8485;master2:8485;worker1:8485/ns1</value>
</property>
<!-- 指定JN数据在本地磁盘的存放位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/hadoop/hadoop/edits</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>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!-- 配置block副本数 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
配置yarn-site.xml
<!-- 启用RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 自定义RM的id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 指定分配RM服务的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>master2</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>master1:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>master2:8088</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master1:2181,master2:2181,worker1:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
配置marped-site.xml
<!-- 指定mr框架为yarn -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
配置hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_131
配置slaves
指定DataNode节点(hostname)
worker1
worker2
将配置好的Hadoop复制到其他节点
# scp -r hadoop-2.7.3 root@master2:/usr/hadoop/
...
配置环境变量
# vim /etc/profile
export HADOOP_PREFIX=/usr/hadoop/hadoop-2.7.3
export PATH=$PATH:$HADOOP_PREFIX/bin:$HADOOP_PREFIX/sbin
# source /etc/profile
集群启动
启动Zookeeper
在master1,master2,worker1上执行:# zkServer.sh start
查看状态# zkServer.sh status
,一个leader,两个flower
启动JournalNode
在master1,master2,worker1上执行:# hadoop-daemon.sh start journalnode
格式化HDFS
在master1上格式化namenode:# hdfs namenode -format
在master1上启动namenode:# hadoop-daemon.sh start namenode
在master2上格式化namenode:# hdfs namenode -bootstrapStandby
格式化zkfc
在master1上执行:# hdfs zkfc -formatZK
启动HDFS
在master1上执行:# start-dfs.sh
启动Yarn
在master1上执行:# start-yarn.sh
在master2上执行:# yarn-daemon.sh start resourcemanager
启动完成
Hadoop已经启动完成,可以访问网页:namenode-ip:50070
来查看集群状态并浏览集群文件
验证NameNode高可用
首先分别访问:master1:50070
和master2:50070
网页,查看这两个节点的状态:
可以看到,master1节点为active状态。
然后我们手动kill掉master1的namenode服务:
去master2:50070网页查看发现master2已经变为active状态:
我们再手动启动master1的namenode服务:# hadoop-daemon.sh start namenode
去master1:50070网页查看,master1处于standby状态
自动故障切换验证成功!!!
OVER
至此,Hadoop的部署已经完成,本文给出的配置只是最简单、最基础的配置,其它详细参数配置请参考官网:Apache Hadoop 2.7.3 Doc
当然你也可以测试一下MR任务的执行,跑一个WordCount,这里就不演示了。