目录
一、Hadoop 2.0 改进与提升
二、YARN资源管理框架
1、YARN体系结构
(1)ResourceManager
(2)NodeManager
(3)ApplicationMaster
2、YARN工作流程
三、HDFS的高可用
1、HDFS的高可用架构
四、Hadoop高可用集群的搭建
1、部署集群节点
五、配置高可用集群
1、修改 hadoop-env.sh 文件
2、修改 core-site.xml 文件
3、修改 hdfs-site.xml 文件
4、修改 mapred-site.xml 文件
5、修改 yarn-site.xml 文件
6、修改 slaves 文件
7、分发配置文件
五、启用Hadoop高可用集群
1、启动集群各个节点上的Zookeeper服务
2、启动集群各个节点监控NameNode的管理日志的JournalNode
3、在hadoop01格式化NameNode,并将格式化后的目录复制到hadoop02中
4、在hadoop01格式化ZKFC
5、在Hadoop01上启动所有HDFS服务进程
6、在Hadoop01上启动所有YARN服务进程
7、查看服务进程
六、关闭Hadoop集群
1、在Hadoop01上关闭所有YARN服务进程
2、在Hadoop01上关闭所有HDFS服务进程
3、在集群各个节点上的关闭Zookeeper服务
4、在hadoop01上执行命令关闭集群各个节点的JournalNode
5、对比:在集群各个节点关闭自身的JournalNode,执行命令
组件 | Hadoop 1.0 的局限和不足 | Hadoop 2.0 的改进 |
---|---|---|
HDFS | NameNode 存在单点故障风险 | HDFS 引用高可用机制 |
MapReduce | JobTracker 存在单点故障风险,且内存扩展受限 | 引入了一个资源管理调度框架 YARN |
YARN是一个通用的资源管理系统和调度平台,它的基本设计思想是将Hadoop 1.0 中的MapReduce里的JobTracker拆分为两个独立的任务,这两个任务分别是全局资源管理器ResourceManager和每个应用程序特有的ApplicationMaster。其中,ResourceManager负责整个系统的资源管理和分配,而ApplicationMaster负责单个应用程序的管理。
ResourceManager是一个全局的资源管理系统,负责整个 YARN 集群资源的监控、分配和管理工作,具体工作如下:
a、负责处理客户端请求;
b、接收和监控 NodeManager(NM)的资源情况;
c、启动和监控ApplicationMaster(AM);
d、资源的分配和调度。
在ResourceManager内部包含了两个组件,分别是调度器(Schedule和应用程序管理器(Application Manager),其中调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。该调度器是一个“纯调度器”,它不再从事任何与具体应用程序相关的工作应用程序管理器负责管理整个系统中所有的应用程序,包括应用程序的提交调度协调资以启动ApplicationMaster、监控 ApplicationMaster 运行状态并在失败时重新启动。
NodeManager 是每个节点上的资源和任务管理器,一方面,它会定时地向 esourceManager 汇报所在节点的资源使用情况;另一方面,它会接收并处理来自 ApplicationMaster的启动停止容器(Container)的各种请求。
用户提交的每个应用程序都包含一个ApplicationMaster,它负责协调来自 ResourceManager的资源,把获得的资源分配给内部的各个任务,从而实现”二次分配“。除此之外,ApplicationMaster 还会通过 NodeManager监控容器的执行和资源使用情况,并在任务运行失败时重新为任务申请资源以重启任务。当前的 YARN 自带了两个 ApplicationMaster的实现,一个是用于演示ApplicationMaster编写方法的实例程序 DistributedShell,它可以申请一定数目的Container 以并行方式运行一个Shell 命令或者 Shell脚本;另一个则是运行 MapReduce 应用程序的 ApplicationMaster-MRAppMaster
需要注意的是,ResourceManager 负责监控 ApplicationMaster,并在ApplicationMaster运行失败的时候重启,大大提高集群的拓展性。ResourceManager 不负责 ApplicationMaster内部任务的容错。任务的容错由 ApplicationMaster完成,总体来说,ApplicationMaster的主要功能是资源的调度、监控与容错。
(1)用户通过客户端Client向 YARN 提交应用程序 Application,提交的内容包含Applicatin的必备信息,如ApplicationMastet程序,启动ApplicsticnMasie的合令,程序等。
(2)YARN 中的 ResourceManager 接收到客户端应用程序的请求后 ResourceMansger 中的调度器(Scheduler)会为应用程序分配一个容器,用于运行本次程序对应的 ApplicationMaster。
(3)ApplicationMaster 被创建后首先向 ResourceManager 注册信息,这样用户可以通过 ResourceManager 查看应用程序的运行状态,接下来第(4)~(7)步是应用程序的其体执行步骤。
(4)ApplicationMaster 采用轮询的方式通过RPC 协议向ResourceManager申请资源。
(5)ResourceManager 向提出申请的 ApplicationMaster 分配资源,一旦ApplicationMaste申请到资源后,便与对应的NodeManager通信,要求启动任务。
(6)NodeManager 为任务设置好运行环境(包括环境变量、jar包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
(7)各个任务通过某个RPC协议向 ApplicationMaster 汇报自己的状态和进度,让 ApplicationMaster随时掌握各个任务的运行状态,从面可以在任务失败时重新启动任务。
(8)应用运行结束后,ApplicationMaster 向 ResoureeMansger 注销自己,并关闭自己。如果ApplicationMaster 因为发生故障导致任务失败,那么 ResourceManager 中的应用程序管理器会将其重新启动,直到所有任务执行完毕。
在HDFS中,NameNode 是系统的核心节点,它存储了各类元数据信息,并负责管理件系统的命名空间和客户端对文件的访问,但是·在Hadoop 1.0 版本中,NameNode 只一个,一旦这个NameNode 发生故障,就会导致整个 Hadoop 集群不可用,也就是发生了单点故障问题。
为了解决单点故障问题,Hadoop 2.0 中的 HDFS 增加了对高可用的支持,在高可用的 HDFS 集群中,通常有两台或者两台以上的机器充当 NameNode,在任意时间内,都要保证至少有一台机器处于活动(Active)状态,一台机器处于备用(Standby)状态。处于活动状态的 NameNode 负责处理客户端请求,而处于备用状态的 NameNode 则处于“随时待命”状态。一旦处于活动状态 NameNode节点发生故障,那么处于备用状态的 NameNode全立即接管它的任务并开始处理客户端请求,保证业务不会出现明显中断,不影响系统的正常对外服务。
Zookeeper 是一种在 HDFS高可用集群中集中提供自动故障转移功能的服务,它为每个NameNode 都分配了一个故障恢复控制器(Zookeeper Failover Controller,ZKFC),该控制器用于监控 NameNode 的健康状态,并通过“心跳”方式定期和 Zookeeper 保持通信。一旦 NameNode 发生故障,Zookeeper 会通知备用状态的 NameNode 启动,使其成为活动状态去处理客户端请求,从而实现高可用。
搭建虚拟机以及Zookeeper可参考作者之前的文章:
大数据技术之Hadoop学习(一)_雨诺风的博客-CSDN博客
大数据技术之Hadoop(五)——Zookeeper_雨诺风的博客-CSDN博客
服务器 | NameNode | DataNode | ResourceManager | NodeManager | JournalNode | Zookeeper | ZKFC |
---|---|---|---|---|---|---|---|
hadoop01.bgd01 | Y | Y | Y | Y | Y | Y | Y |
hadoop02.bgd01 | Y | Y | Y | Y | Y | Y | |
hadoop03.bgd01 | Y | Y | Y | Y |
3个服务器组成了一个Zookeeper集群。其中 hadoop01.bgd01 和 hadoop02.bgd01 作为集群的 NameNode,需要运行 ZKFC 来监控 NameNode 的健康状态。
找到这一行,修改jdk的路径
# The java implementation to use.
export JAVA_HOME=/export/servers/jdk
fs.defaultFS
hdfs://ns1
hadoop.tmp.dir
/export/servers/hadoop-2.10.1/tmpha #为了便于同伪分布和分布式集群之间切换
ha.zookeeper.quorum
hadoop01.bgd01:2181,hadoop02.bgd01:2181,hadoop03.bgd01:2181
hadoop.zk.address
hadoop01.bgd01:2181,hadoop02.bgd01:2181,hadoop03.bgd01:2181
ha.zookeeper.parent-znode
/hadoop-ha
dfs.replication
2
dfs.namenode.name.dir
file:/export/data/hadoop/name
dfs.namenode.data.dir
file:/export/data/hadoop/data
dfs.webhdfs.enabled
true
dfs.nameservices
ns1
dfs.ha.namenodes.ns1
nn1,nn2
dfs.namenode.rpc-address.ns1.nn1
hadoop01.bgd01:9000
dfs.namenode.http-address.ns1.nn1
hadoop01.bgd01:50070
dfs.namenode.rpc-address.ns1.nn2
hadoop02.bgd01:9000
dfs.namenode.http-address.ns1.nn2
hadoop02.bgd01:50070
dfs.namenode.shared.edits.dir
qjournal://hadoop01.bgd01:8485;hadoop02.bgd01:8485;hadoop03.bgd01:8485/ns1
dfs.journalnode.edits.dir
/export/data/hadoop/journaldata
ipc.client.connect.max.retries
30 ide
dfs.ha.automatic-failover.enabled
true
dfs.client.failover.proxy.provider.ns1
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
dfs.ha.fencing.methods
sshfence
shell(/bin/true)
dfs.ha.fencing.ssh.private-key-files
/root/.ssh/id_rsa
dfs.ha.fencing.ssh.connect-timeout
3000
先将mapred-site.xml.template 复制到 mapred-site.xml
mapreduce.framework.name
yarn
yarn.scheduler.maximum-allocation-mb
8192
yarn.nodemanager.resource.memory-mb
8192
yarn.nodemanager.resource.cpu-vcores
8
yarn.resourcemanager.ha.enabled
true
yarn.resourcemanager.cluster-id
yrc
yarn.resourcemanager.ha.rm-ids
rm1,rm2
yarn.resourcemanager.hostname.rm1
hadoop01.bgd01
yarn.resourcemanager.hostname.rm2
hadoop02.bgd01
yarn.resourcemanager.webapp.address.rm1
${yarn.resourcemanager.hostname}:8088
yarn.resourcemanager.webapp.address.rm2
${yarn.resourcemanager.hostname}:8088
yarn.nodemanager.aux-services
mapreduce_shuffle
hadoop01.bgd01
hadoop02.bgd01
hadoop03.bgd01
将/export目录下的 servers 和 data 目录分发到其它节点"/export/"目录下:
scp -r /export/servers hadoop02.bgd01:/export/
scp -r /export/servers hadoop03.bgd01:/export/
scp -r /export/data hadoop02.bgd01:/export/
scp -r /export/data hadoop03.bgd01:/export/
将配置文件/etc/profile分发到其它节点:
scp /etc/profile hadoop02.bgd01:/etc/profile
scp /etc/profile hadoop03.bgd01:/etc/profile
执行完上述命令后,还需在hadoop02、hadoop03上分别执行"source /etc/profile"指令立即刷新配置文件。
zkServer.sh start
hadoop-daemons.sh start journalnode
注:只需在第一次初始化启动集群时运行一次。以后每次启动集群,journalnode会在步骤 5、start-dfs.sh中启动。
hdfs namenode -format
(执行格式化指令后必须出现 successfulluy formatted 才表示格式化成功。)
scp -r /export/data/hadoop hadoop02.bgd01:/export/data/
hdfs zkfc -formatZK
start-dfs.sh
start-yarn.sh
集群启动后,如果正常,执行命令
JPS
查看进程。
hadoop01上可以查看到如下进程:
NameNode
DFSZKFailoverController
ResourceManager
DataNode
Jps
JournalNode
NodeManager
QuorumPeerMain
hadoop02上可以查看到如下进程:
NameNode
DFSZKFailoverController
DataNode
Jps
JournalNode
NodeManager
QuorumPeerMain
hadoop03上可以查看到如下进程:
DataNode
Jps
JournalNode
NodeManager
QuorumPeerMain
stop-yarn.sh
stop-dfs.sh
zkServer.sh stop
hadoop-daemons.sh stop journalnode
hadoop-daemon.sh stop journalnode
参考书籍:
《Hadoop大数据技术原理与应用》