Hadoop-2.7.3高可用配置

Author Avatar
山小杰 11月 18, 2017
  • 在其它设备中阅读本文章

简介

前一篇文章已经大致介绍了安装Hadoop需要的一些环境准备工作,这篇文章就来进行下原生Hadoop(完全分布式+高可用)的安装与配置。

Hadoop Namenode存在单点故障问题,Hadoop2.0版本以后可以开启两个Namenode来解决这个问题,一个为Active Namenode管理集群,一个为Standby Namenode作为热备份。

Standby Namenode节点与Active Namenode节点之间数据的同步依赖于JournalNode服务。
Zookeeper和ZKFC(ZKFailoverController)服务可以保证集群中有且只有一个Active状态的Namenode。

本文同时配置了NameNodeResource 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

zk-myid

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
zkStart
查看状态# zkServer.sh status,一个leader,两个flower
zkStatus
zkStatus1
zkStatus2

启动JournalNode

在master1,master2,worker1上执行:
# hadoop-daemon.sh start journalnode
JNStart

格式化HDFS

在master1上格式化namenode:
# hdfs namenode -format
nn1
在master1上启动namenode:
# hadoop-daemon.sh start namenode
nnStart
在master2上格式化namenode:
# hdfs namenode -bootstrapStandby
nn2

格式化zkfc

在master1上执行:
# hdfs zkfc -formatZK
zkfc

启动HDFS

在master1上执行:
# start-dfs.sh
hdfsStart

启动Yarn

在master1上执行:
# start-yarn.sh
yarn1
在master2上执行:
# yarn-daemon.sh start resourcemanager
yarn2

启动完成

Hadoop已经启动完成,可以访问网页:namenode-ip:50070来查看集群状态并浏览集群文件

验证NameNode高可用

首先分别访问:master1:50070master2:50070网页,查看这两个节点的状态:
n1
n2
可以看到,master1节点为active状态。
然后我们手动kill掉master1的namenode服务:
kill
去master2:50070网页查看发现master2已经变为active状态:
HATest
我们再手动启动master1的namenode服务:
# hadoop-daemon.sh start namenode
HA2
去master1:50070网页查看,master1处于standby状态
HA22
自动故障切换验证成功!!!

OVER

至此,Hadoop的部署已经完成,本文给出的配置只是最简单、最基础的配置,其它详细参数配置请参考官网:Apache Hadoop 2.7.3 Doc

当然你也可以测试一下MR任务的执行,跑一个WordCount,这里就不演示了。