一、HadoopHA集群
官方文档:
http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/
HA是指高可用,为了解决 Hadoop单点故障问题,生产环境一般都做HA部署。
1)Namenode机器:运行Active Namenode和Standby Namenode的机器配置应保持一样,也与不使用HA情况下的配置一样。
2)JournalNode机器:运行JournalNode的机器,这些守护进程比较轻量级,所以可以将其部署在Namenode或者YARN ResourceManager。至少需要部署3个Journalnode节点,以便容忍一个节点故障。通常配置成奇数,例如总数为N,则可以容忍(N-1)/2台机器发生故障后集群仍然可以正常工作。
需要注意的是,Standby Namenode同时完成了原来Secondary namenode的checkpoint功能,因此不需要独立再部署Secondary namenode。
二、HDFS HA与QJM
HDFS集群中只有一个Namenode,这就会引入单点问题;即如果Namenode故障,那么这个集群将不可用,直到Namenode重启或者其他Namenode接入。
有两种方式会影响集群的整体可用性:
1、意外的突发事件,比如物理机器crash,集群将不可用,直到管理员重启Namenode。
2、系统维护,比如软件升级等,需要关闭Namenode,也会导致集群暂时性的失效。
HDFS HA特性即解决这个问题,它通过在集群中同时运行2个Namenodes,并让active和passive之间热备(hot standby)。当Active Namenode故障失效后,即可快速故障转移到新的Namenode上(passive Namenode);也可以在计划维护期间,基于管理员发起(administrator-inited)的友好的failover。
三、HA架构
在典型的HA架构中,有两个独立的机器作为Namenode,任何时刻,只有一个Namenode处于Active状态,另一个处于standby状态(passive,备份);Active Namenode用于接收Client端请求,Standy节点作为slave保持集群的状态数据以备快速failover。
为了让Standby Node与Active Node保持同步,这两个Node都与一组称为JNS的互相独立的进程保持通信(Journal Nodes)。当Active Node上更新了namespace,它将记录修改日志发送给JNS的多数派。Standby noes将会从JNS中读取这些edits,并持续关注它们对日志的变更。Standby Node将日志变更应用在自己的namespace中,当failover发生时,Standby将会在提升自己为Active之前,确保能够从JNS中读取所有的edits;即在failover发生之前,Standy持有的namespace应该与Active保持完全同步。
为了支持快速failover,Standby node持有集群中blocks的最新位置是非常必要的。为了达到这一目的,Datanodes上需要同时配置这两个Namenode的地址,同时和它们都建立心跳链接,并把block位置发送给它们。
任何时刻,只有一个Active Namenode是非常重要的,否则将会导致集群操作的混乱,那么两个Namenode将会分别有两种不同的数据状态,可能会导致数据丢失,或者状态异常,这种情况通常称为“split-brain”(脑裂,三节点通讯阻断,即集群中不同的Datanodes却看到了两个Active Namenodes)。对于JNS(Journal Nodes)而言,任何时候只允许一个Namenode作为writer;在failover期间,原来的Standby Node将会接管Active的所有职能,并负责向JNS写入日志记录,这就阻止了其他Namenode基于处于Active状态的问题。
四、硬件资源
1. 为了构建HA集群架构,你需要准备如下资源:
1、Namenode机器:两台配置对等的物理机器,它们分别运行Active和Standby Node。
2、JouralNode机器:运行JouralNodes的机器。JouralNode守护进程相当的轻量级,它们可以和hadoop的其他进程部署在一起,比如Namenodes、jobTracker、ResourceManager等。不过为了形成多数派(majority),至少需要3个JouralNodes,因为edits操作必须在多数派上写入成功。当然JNS的个数可以 > 3,且通常为奇数(3,5,7),这样可以更好的容错和形成多数派。如果你运行了N个JNS,那么它可以允许(N-1)/2个JNS进程失效并且不影响工作。
此外,在HA集群中,standby namenode还会对namespace进行checkpoint操作(继承Backup Namenode的特性),因此,就不需要在HA集群中运行SecondaryNamenode、CheckpointNode或者BackupNode。事实上,HA架构中运行上述节点,将会出错(不允许)。
HA架构
2. 集群规划
服务器 | IP地址 | 软件 | 服务 | 备注 |
---|---|---|---|---|
master | 192.168.71.130 | JDK、Hadoop、Zookeeper | DataNode、NodeManager、 NameNode、resourcemanager JobHistoryServer |
主机(名称与资源节点) |
slave1 | 192.168.71.129 | JDK、Hadoop、Zookeeper | DataNode、NodeManager、NameNode | 从机(名称节点-备) |
slave2 | 192.168.71.132 | JDK、Hadoop、Zookeeper | DataNode、NodeManager、resourcemanager | 从机(资源节点-备) |
五、安装配置Zookeeper集群
Quorum Journal Manager (QJM) 模式。
HDFS的自动故障转移主要由Zookeeper和ZKFC两个组件组成。
Zookeeper集群作用主要有:
一是故障监控。
每个NameNode将会和Zookeeper建立一个持久session,如果NameNode失效,那么此session将会过期失效,此后Zookeeper将会通知另一个Namenode,然后触发Failover;
二是NameNode选举。
ZooKeeper提供了简单的机制来实现Acitve Node选举,如果当前Active失效,Standby将会获取一个特定的排他锁,那么获取锁的Node接下来将会成为Active。
ZKFC是一个Zookeeper的客户端,它主要用来监测和管理NameNodes的状态,每个NameNode机器上都会运行>一个ZKFC程序,它的职责主要有:
一是健康监控。
ZKFC间歇性的ping NameNode,得到NameNode返回状态,如果NameNode失效或者不健康,那么ZKFS将会标记其为不健康;
二是Zookeeper会话管理。
当本地NameNode运行良好时,ZKFC将会持有一个Zookeeper session,如果本地NameNode为Active,它同时也持有一个“排他锁”znode,如果session过期,那么次lock所对应的znode也将被删除;
三是选举。
当集群中其中一个NameNode宕机,Zookeeper会自动将另一个激活。
1. 前置条件
安装JDK
2. 下载zookeeper
下载地址:https://zookeeper.apache.org/releases.html
# 下载zookeeper
root@master:~# wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
# 解压文件
root@master:~# tar -zxvf zookeeper-3.4.14.tar.gz -C /usr/local
# 配置环境变量
root@master:~# vi /etc/profile
# 内容
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.14
export PATH=$PATH:$ZOOKEEPER_HOME/bin
# 环境变量生效
root@master:~# source /etc/profile
3. zookeepe配置
# 创建文件(复制模板)
root@master:~# cp /zookeeper/zookeeper-3.4.14/conf/zoo_sample.cfg /zookeeper/zookeeper-3.4.14/conf/zoo.cfg
# 修改配置:
root@master:~# vi /zookeeper/zookeeper-3.4.14/conf/zoo.cfg
# 内容
tickTime=2000
syncLimit=5
dataDir=/zookeeper/tmp
# 客户端端口
clientPort=2181
# 主机名, 心跳端口、数据端口)(2888是leader和follow之间通信,3888是投票选举时用的端口)
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
4. 创建日志与数据目录
# 创建data和datalog两个目录
root@master:~# mkdir -p /zookeeper/data
root@master:~# mkdir -p /zookeeper/datalog
# 打包分发文件
root@master:/usr/local# tar -cvf zookeeper.tar zookeeper-3.4.14/
root@master:/usr/local# scp zookeeper.tar root@slave1:/root
root@master:/usr/local# scp zookeeper.tar root@slave2:/root
5. 创建myid文件
需在每台主机配置,注意:值为配置文件中server中的值
root@master:~# cd /zookeeper/data
root@master:/zookeeper/data# echo 1 > myid
root@slave1:/zookeeper/data# echo 2 > myid
root@slave2:/zookeeper/data# echo 3 > myid
注意:myid文件一定要放在dataDir目录 下。
6. 启动测试
# 启动ZK服务 (按id顺序)
root@master:/# zkServer.sh start
root@slave2:~# zkServer.sh start
root@slave1:~# zkServer.sh start
# 分别查看三个节点的状态,可以看到一个leader和两个follower,说明zookeeper安装成功。
root@slave2:/usr/local/zookeeper-3.4.14# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: leader
root@slave1:/usr/local/zookeeper-3.4.14# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower
root@master:/usr/local/zookeeper-3.4.14# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower
# 停止服务
root@slave1:~# zkServer.sh stop
# 重启ZK服务
root@slave1:~# zkServer.sh restart
可以看到有两个:follower 一个:leader
六、Hadoop HA配置
1. HDFS 配置(hdfs-site.xml)
1) 编辑
root@master:~# vi /usr/local/hadoop-2.9.2/etc/hadoop/hdfs-site.xml
2)内容
<configuration>
<!--服务的逻辑名称-->
<property>
<name>dfs.nameservices</name>
<value>hadoopha</value>
</property>
<!--Namenode配置 名称节点ID,必须是唯一的。-->
<property>
<name>dfs.ha.namenodes.hadoopha</name>
<value>hadoop1,hadoop2</value>
</property>
<!--Namenode RPC地址,默认为8020,这里我们改为9000-->
<property>
<name>dfs.namenode.rpc-address.hadoopha.hadoop1</name>
<value>master:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hadoopha.hadoop2</name>
<value>slave1:9000</value>
</property>
<!--NameNode Http地址配置 -->
<property>
<name>dfs.namenode.http-address.hadoopha.hadoop1</name>
<value>master:50070</value>
</property>
<!--各个namenode的HTTP地址。它和non-ha下的"dfs.namenode.http-address"配置作用一样。 -->
<property>
<name>dfs.namenode.http-address.hadoopha.hadoop2</name>
<value>slave1:50070</value>
</property>
<!--这是配置备份节点需要随时保持同步活动节点所作更改的远程共享目录,你只能配置一个目录,之个目录挂载到两个namenode上都必须是可读写的,且必须是绝对路径。-->
<!--edit log保存目录,也就是Journal Node集群地址,分号隔开
Jouralnode节点配置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>/hadoop/journal/shared</value>
</property>
<!--edit日志保存路径 指定journalNode存储edits文件的本地路径。-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/hadoop/journal/data</value>
</property>
<!-- 开启NameNode故障时自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.hadoopha</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制,如果ssh是默认22端口,value直接写sshfence即可 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!--配置隔离机制ssh连接超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!-- 使用隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 设置namenode存放的路径 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/hadoop/tmp/name</value>
</property>
<property><name>dfs.datanode.data.dir</name>
<value>/hadoop/tmp/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
配置说明:
1)dfs.nameservices
nameservice的逻辑名称。可以为任意可读字符串;
<!--服务的逻辑名称-->
<property>
<name>dfs.nameservices</name>
<value>hadoopha</value>
</property>
2)dfs.ha.namenodes
名称节点ID,必须是唯一的。
<!--Namenode配置-->
<property>
<name>dfs.ha.namenodes.hadoopha</name>
<value>hadoop1,hadoop2</value>
</property>
3)dfs.namenode.rpc-address.[nameservice ID].[namenode ID]
其中nameservice ID需要与namenode ID需要和以上匹配。配置项的值为相应namenode的hostname以及通讯端口号(Client与namenode RPC通讯端口),它和non-ha模式下“dfs.namenode.rpc-address”作用一样。每个namenode ID都需要单独配置。
<!--Namenode RPC地址,默认为8020,这里我们改为9000-->
<property>
<name>dfs.namenode.rpc-address.hadoopha.hadoop1</name>
<value>hadoopmaster:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hadoopha.hadoop2</name>
<value>hadoopslave1:9000</value>
</property>
4)dfs.namenode.http-address.[nameservice ID].[namenode ID]
各个namenode的HTTP地址。它和non-ha下的"dfs.namenode.http-address"配置作用一样。
<!--NameNode Http地址配置 -->
<property>
<name>dfs.namenode.http-address.hadoopha.hadoop1</name>
<value>master:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.hadoopha.hadoop2</name>
<value>slave1:50070</value>
</property>
5)dfs.namenode.shared.edits.dir
这是配置备份节点需要随时保持同步活动节点所作更改的远程共享目录,你只能配置一个目录,之个目录挂载到两个namenode上都必须是可读写的,且必须是绝对路径。
<!--edit log保存目录,也就是Journal Node集群地址,分号隔开
Jouralnode节点配置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>/hadoop/journal/shared</value>
</property>
6)dfs.journalnode.edits.dir
指定journalNode存储edits文件的本地路径。
<!--edit日志保存路径 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/hadoop/journal/data</value>
</property>
7)dfs.ha.automatic-failover.enabled
<!-- 开启NameNode故障时自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
8)dfs.client.failover.proxy.provider.[nameservice ID]
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.hadoopha</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
9)dfs.ha.fencing.methods
在failover期间用来隔离Active Namenode的脚本或者java 类列表。
虽然JNS可以确保集群中只有一个Active Node写入edits,这对保护edits一致性很重要,但是在failover期间,有可能Acitive Node仍然存活,Client可能还与其保持连接提供旧的数据服务,我们可以通过此配置,指定shell脚本或者java程序,SSH到Active NameNode然后Kill Namenode进程。它有两种可选值:
1)sshfence
:SSH登录到Active Namenode,并Kill此进程。首先当前机器能够使用SSH登录到远端,前提是已经授权(rsa)。
2)shell
:运行shell指令隔离Active Namenode。
<!-- 配置隔离机制,如果ssh是默认22端口,value直接写sshfence即可 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
10)dfs.ha.fencing.ssh.connect-timeout
<!--配置隔离机制ssh连接超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
11)dfs.ha.fencing.ssh.private-key-files
<!-- 使用隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
12)分发文件
root@master:~# scp /usr/local/hadoop-2.9.2/etc/hadoop/hdfs-site.xml root@slave1:/usr/local/hadoop-2.9.2/etc/hadoop/
hdfs-site.xml 100% 1281 3.1MB/s 00:00
root@master:~# scp /usr/local/hadoop-2.9.2/etc/hadoop/hdfs-site.xml root@slave2:/usr/local/hadoop-2.9.2/etc/hadoop/
hdfs-site.xml 100% 1281 3.1MB/s 00:00
2. core-site.xml配置
# 编辑
root@master:~# cat /usr/local/hadoop-2.9.2/etc/hadoop/core-site.xml
1)内容
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://hadoopha</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/tmp</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
<!--指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
</configuration>
2)文件分发
root@master:~# scp /usr/local/hadoop-2.9.2/etc/hadoop/core-site.xml root@slave1:/usr/local/hadoop-2.9.2/etc/hadoop/
core-site.xml 100% 1281 3.1MB/s 00:00
root@master:~# scp /usr/local/hadoop-2.9.2/etc/hadoop/core-site.xml root@slave2:/usr/local/hadoop-2.9.2/etc/hadoop/
core-site.xml 100% 1281 3.1MB/s 00:00
七、HDFS HA集群启动
1. 启动HDFS HA集群
1)清空目录
# 删除所有节点的/hadoop目录(如果原目录有数据)
root@master:~# rm -rf /hadoop/
root@slave1:~# rm -rf /hadoop/
root@slave2:~# rm -rf /hadoop/
2)启动ZooKeeper
# 启动ZooKeeper
root@master:/usr/local/zookeeper-3.4.14# ./bin/zkServer.sh start
root@slave1:/usr/local/zookeeper-3.4.14# ./bin/zkServer.sh start
root@slave2:/usr/local/zookeeper-3.4.14# ./bin/zkServer.sh start
3)格式化节点(所有hadoop服务必须停止)
# 格式化名称节点(master与slave1都分别格式化)
# master主机
root@master:~# hdfs namenode -format
# slave1主机(可以不格式化)
root@slave1:~# hdfs namenode -format
# 格式化zk的文件(只进行master格式化)
root@master:~# hdfs zkfc -formatZK
4)初始化数据
# 初始化数据
# 必须停止所有hadoop服务
root@master:~# hdfs namenode -initializeSharedEdits
5)共享数据进行初始化(必须启master节点服务)
# 首次,要进行启动。
root@master:~# hadoop-daemon.sh start journalnode
# 复制目录到备机
root@master:~# scp -r /hadoop/journal root@slave1:/hadoop/
# 同步journalnode的共享数据,必须启主节点服务(slave1上执行)
root@master:~# start-dfs.sh
root@slave1:~# hdfs namenode -bootstrapStandby
6)启动HDFS
# 停止HDFS
root@master:~# stop-dfs.sh
# 启动HDFS
root@master:~# start-dfs.sh
Starting namenodes on [master slave1]
slave1: starting namenode, logging to /usr/local/hadoop-2.9.2/logs/hadoop-root-namenode-slave1.out
master: starting namenode, logging to /usr/local/hadoop-2.9.2/logs/hadoop-root-namenode-master.out
slave1: starting datanode, logging to /usr/local/hadoop-2.9.2/logs/hadoop-root-datanode-slave1.out
slave2: starting datanode, logging to /usr/local/hadoop-2.9.2/logs/hadoop-root-datanode-slave2.out
master: starting datanode, logging to /usr/local/hadoop-2.9.2/logs/hadoop-root-datanode-master.out
Starting ZK Failover Controllers on NN hosts [master slave1]
master: starting zkfc, logging to /usr/local/hadoop-2.9.2/logs/hadoop-root-zkfc-master.out
slave1: starting zkfc, logging to /usr/local/hadoop-2.9.2/logs/hadoop-root-zkfc-slave1.out
# master查看服务
root@master:~# jps
96257 DataNode
24435 NameNode
122948 DFSZKFailoverController
91177 QuorumPeerMain
119193 Jps
92060 JournalNode
# slave1查看服务
root@slave1:~# jps
122807 NameNode
70998 QuorumPeerMain
55616 DFSZKFailoverController
123353 Jps
123021 DataNode
7)启动备机journalnode服务
root@slave1:~# hadoop-daemon.sh start journalnode
root@slave1:~# jps
63408 NameNode
55616 DFSZKFailoverController
28627 JournalNode
70998 QuorumPeerMain
31928 DataNode
116300 Jps
8)web状态查看
Activestandby
2. 常用命令:
# DFSZKFailoverController进程
# 启动zkfc
root@master:~# hadoop-daemon.sh start zkfc
starting zkfc, logging to /usr/local/hadoop-2.9.2/logs/hadoop-root-zkfc-master.out
root@master:~# jps
119564 DFSZKFailoverController
# 停止zkfc
root@master:~# hadoop-daemon.sh stop zkfc
stopping zkfc
root@master:~# jps
119153 Jps
96257 DataNode
96807 ResourceManager
91177 QuorumPeerMain
97049 NodeManager
118699 NameNode
92060 JournalNode
3. NameNode手动切换
# 查看虚拟机1的namenode状态
root@master:~# hdfs haadmin -getServiceState hadoop1
active
# 查看虚拟机2的namenode状态
root@master:~# hdfs haadmin -getServiceState hadoop2
standby
# 将虚拟机2的namenode状态切换为active
root@master:~# hdfs haadmin -failover --forcefence --forceactive hadoop1 hadoop2
forcefence and forceactive flags not supported with auto-failover enabled.
4. 测试HDFS HA
停掉名称节点:
root@master:~# hadoop-daemon.sh stop namenode
启动名称节点:
root@master:~# hadoop-daemon.sh start namenode
切换前:
master
slave1
root@master:~# hadoop-daemon.sh stop namenode
切换后:
slave1
root@master:~# hadoop-daemon.sh start namenode
starting namenode, logging to /usr/local/hadoop-2.9.2/logs/hadoop-root-namenode-master.out
master
5. 文件上传测试--验证HDFS
# 上传wordcount
root@master:/usr/local/hadoop-2.9.2# hadoop fs -put /root/wordcount.txt /wordcount
文件上传测试
八、时间同步服务
# NTP服务:
http://time1.aliyun.com
http://time2.aliyun.com
http://time3.aliyun.com
http://time4.aliyun.com
http://time5.aliyun.com
http://time6.aliyun.com
http://time7.aliyun.com
# 安装ntp服务
root@master:~# sudo apt-get install ntp
root@slave1:~# sudo apt-get install ntp
root@slave2:~# sudo apt-get install ntp
# 启动ntpdate服务(如果同步阿里云,请不要启动该服务)
root@master:~# systemctl start ntp
root@slave1:~# systemctl start ntp
root@slave2:~# systemctl start ntp
# 安装ntp客户端
root@master:~# sudo apt-get install ntpdate
root@slave1:~# sudo apt-get install ntpdate
root@slave2:~# sudo apt-get install ntpdate
# 同步时间到阿里云
root@slave2:~# systemctl stop ntp
root@slave2:~# ntpdate ntp1.aliyun.com
27 Nov 16:34:56 ntpdate[115513]: adjust time server 120.25.115.20 offset 0.000600 sec
九、YARN HA集群
1. 配置
1)编辑
root@master:~# vi /usr/local/hadoop-2.9.2/etc/hadoop/yarn-site.xml
2)内容
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--开启resourcemanagerHA,默认为false-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
<description>启用RM高可用性</description>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn1</value>
<description>YARN集群ID</description>
</property>
<!--配置resourcemanager-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
<description>启用HA时,集群中的RM节点列表</description>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master</value>
<description>第1个resourcemanager</description>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>slave2</value>
<description>第2个resourcemanager</description>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master:2181,slave1:2181,slave2:2181</value>
<description>Zookeeper列表</description>
</property>
<!--启用自动恢复-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--指定resourcemanager的状态信息存储在zookeeper集群-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 表示rm1,rm2的网页访问地址和端口,也即通过该地址和端口可访问作业情况 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>master:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>slave2:8088</value>
</property>
<!-- 日志聚合 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>106800</value>
</property>
</configuration>
3. 文件分发
root@master:~# scp /usr/local/hadoop-2.9.2/etc/hadoop/yarn-site.xml root@slave2:/usr/local/hadoop-2.9.2/etc/hadoop/
yarn-site.xml 100% 1936 2.5MB/s 00:00
root@master:~#
4. 启动服务
# 启动服务
root@master:~# start-yarn.sh
root@slave2:~# start-yarn.sh
# 状态查看
root@master:~# yarn rmadmin -getServiceState rm1
active
root@master:~# yarn rmadmin -getServiceState rm2
standby
5. 测试
1)控制台查看
# 停止rm1
root@master:~# yarn-daemon.sh stop resourcemanager
# 查看rm2
root@master:~# yarn rmadmin -getServiceState rm2
active
# 启动rm1
root@master:~# yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /usr/local/hadoop-2.9.2/logs/yarn-root-resourcemanager-master.out
# 查看rm1
root@master:~# yarn rmadmin -getServiceState rm1
standby
2)Web页面查看
master slave23) 运行作业测试--验证YARN
root@master:/usr/local/hadoop-2.9.2# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount /wordcount /output1
19/11/29 10:43:21 INFO input.FileInputFormat: Total input files to process : 1
19/11/29 10:43:21 INFO mapreduce.JobSubmitter: number of splits:1
19/11/29 10:43:21 INFO Configuration.deprecation: yarn.resourcemanager.zk-address is deprecated. Instead, use hadoop.zk.address
19/11/29 10:43:21 INFO Configuration.deprecation: yarn.resourcemanager.system-metrics-publisher.enabled is deprecated. Instead, use yarn.system-metrics-publisher.enabled
19/11/29 10:43:22 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1574995391746_0001
19/11/29 10:43:23 INFO impl.YarnClientImpl: Submitted application application_1574995391746_0001
19/11/29 10:43:23 INFO mapreduce.Job: The url to track the job: http://master:8088/proxy/application_1574995391746_0001/
19/11/29 10:43:23 INFO mapreduce.Job: Running job: job_1574995391746_0001
19/11/29 10:43:33 INFO mapreduce.Job: Job job_1574995391746_0001 running in uber mode : false
19/11/29 10:43:33 INFO mapreduce.Job: map 0% reduce 0%
19/11/29 10:43:40 INFO mapreduce.Job: map 100% reduce 0%
19/11/29 10:43:48 INFO mapreduce.Job: map 100% reduce 100%
19/11/29 10:43:48 INFO mapreduce.Job: Job job_1574995391746_0001 completed successfully
19/11/29 10:43:48 INFO mapreduce.Job: Counters: 49
File System Counters
FILE: Number of bytes read=89
FILE: Number of bytes written=403097
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=171
HDFS: Number of bytes written=55
HDFS: Number of read operations=6
HDFS: Number of large read operations=0
HDFS: Number of write operations=2
Job Counters
Launched map tasks=1
Launched reduce tasks=1
Data-local map tasks=1
Total time spent by all maps in occupied slots (ms)=5923
Total time spent by all reduces in occupied slots (ms)=4245
Total time spent by all map tasks (ms)=5923
Total time spent by all reduce tasks (ms)=4245
Total vcore-milliseconds taken by all map tasks=5923
Total vcore-milliseconds taken by all reduce tasks=4245
Total megabyte-milliseconds taken by all map tasks=6065152
Total megabyte-milliseconds taken by all reduce tasks=4346880
Map-Reduce Framework
Map input records=7
Map output records=14
Map output bytes=137
Map output materialized bytes=89
Input split bytes=90
Combine input records=14
Combine output records=7
Reduce input groups=7
Reduce shuffle bytes=89
Reduce input records=7
Reduce output records=7
Spilled Records=14
Shuffled Maps =1
Failed Shuffles=0
Merged Map outputs=1
GC time elapsed (ms)=189
CPU time spent (ms)=1430
Physical memory (bytes) snapshot=383500288
Virtual memory (bytes) snapshot=3871199232
Total committed heap usage (bytes)=170004480
Shuffle Errors
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters
Bytes Read=81
File Output Format Counters
Bytes Written=55
十、常见问题:
1. org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /hadoop/tmp/name is in an inconsistent state: storage directory does not exist or is not accessible.
解决:
重新格式化主从节点。
hdfs namenode -format
2. 自动切换,就不能手动切换了,否则会报如下异常:
forcefence and forceactive flags not supported with auto-failover enabled.
原因:
开启了自动切换。
3. Directory /hadoop/journal/shared is in an inconsistent state: namespaceID is incompatible with others.
root@slave1:~# cat /hadoop/journal/shared/current/VERSION
#Wed Nov 27 13:30:53 CST 2019
namespaceID=953333734
clusterID=CID-8dee0487-9480-4c7f-900a-a00271990f63
cTime=1574832653175
storageType=NAME_NODE
blockpoolID=BP-1628338096-192.168.71.129-1574832653175
layoutVersion=-63
namespaceID 不同。
只格式化主机,在备机同步数据即可。
4. Error: Gap in transactions. Expected to be able to read up until at least txid 1 but unable to find any edit logs containing txid 1
Unable to read transaction ids 1-1 from the configured shared edits storage file:/hadoop/journal/shared. Please copy these logs into the shared edits storage or call saveNamespace on the active node.
原因:
没有拷贝主机的共享文件到备机。
5. java.io.FileNotFoundException: No valid image files found
解决:
没有格式化主节点。
6. 主可以切换备机,备机不可以切换主机。
原因:
可能没有配置备机到主机的ssh免密登录。
7. WARN No appenders could be found for logger (org.apache.hadoop.mapreduce.v2.app.MRAppMaster).
解决:
在yarn-site.xml中添加:
<!-- 表示rm1,rm2的网页访问地址和端口,也即通过该地址和端口可访问作业情况 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>master:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>slave2:8088</value>
</property>
8. java.io.IOException: Gap in transactions. Expected to be able to read up until at least txid 6669 but unable to find any edit logs containing txid 6668
解决:
则将 Active 上整个 name目录复制到 Standby,然后直接启动namenode即可。
root@master:~# scp -r /hadoop/tmp/name/ root@slave1:/hadoop/tmp/
9. ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering> (Datanode Uuid b84f7e74-67c9-4930-8cb6-fedd28e541e8) service to master/192.168.71.130:9000. Exiting.
java.io.IOException: All specified directories have failed to load.
原因是clusterID不一致
解决:
修改clusterID让他们的值相等就可以了。
root@slave1:~# vi /hadoop/tmp/data/current/VERSION
网友评论