目录
2、启动集群各个节点监控NameNode的管理日志的JournalNode
3、在hadoop01格式化NameNode,并将格式化后的目录复制到hadoop02中
4、在hadoop01上执行命令关闭集群各个节点的JournalNode
5、对比:在集群各个节点关闭自身的JournalNode,执行命令
一、Hadoop 2.0 改进与提升
组件 | Hadoop 1.0 的局限和不足 | Hadoop 2.0 的改进 |
---|---|---|
HDFS | NameNode 存在单点故障风险 | HDFS 引用高可用机制 |
MapReduce | JobTracker 存在单点故障风险,且内存扩展受限 | 引入了一个资源管理调度框架 YARN |
二、YARN资源管理框架
1、YARN体系结构
YARN是一个通用的资源管理系统和调度平台,它的基本设计思想是将Hadoop 1.0 中的MapReduce里的JobTracker拆分为两个独立的任务,这两个任务分别是全局资源管理器ResourceManager和每个应用程序特有的ApplicationMaster。其中,ResourceManager负责整个系统的资源管理和分配,而ApplicationMaster负责单个应用程序的管理。
(1)ResourceManager
ResourceManager是一个全局的资源管理系统,负责整个 YARN 集群资源的监控、分配和管理工作,具体工作如下:
a、负责处理客户端请求;
b、接收和监控 NodeManager(NM)的资源情况;
c、启动和监控ApplicationMaster(AM);
d、资源的分配和调度。
在ResourceManager内部包含了两个组件,分别是调度器(Schedule和应用程序管理器(Application Manager),其中调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。该调度器是一个“纯调度器”,它不再从事任何与具体应用程序相关的工作应用程序管理器负责管理整个系统中所有的应用程序,包括应用程序的提交调度协调资以启动ApplicationMaster、监控 ApplicationMaster 运行状态并在失败时重新启动。
(2)NodeManager
NodeManager 是每个节点上的资源和任务管理器,一方面,它会定时地向 esourceManager 汇报所在节点的资源使用情况;另一方面,它会接收并处理来自 ApplicationMaster的启动停止容器(Container)的各种请求。
(3)ApplicationMaster
用户提交的每个应用程序都包含一个ApplicationMaster,它负责协调来自 ResourceManager的资源,把获得的资源分配给内部的各个任务,从而实现”二次分配“。除此之外,ApplicationMaster 还会通过 NodeManager监控容器的执行和资源使用情况,并在任务运行失败时重新为任务申请资源以重启任务。当前的 YARN 自带了两个 ApplicationMaster的实现,一个是用于演示ApplicationMaster编写方法的实例程序 DistributedShell,它可以申请一定数目的Container 以并行方式运行一个Shell 命令或者 Shell脚本;另一个则是运行 MapReduce 应用程序的 ApplicationMaster-MRAppMaster
需要注意的是,ResourceManager 负责监控 ApplicationMaster,并在ApplicationMaster运行失败的时候重启,大大提高集群的拓展性。ResourceManager 不负责 ApplicationMaster内部任务的容错。任务的容错由 ApplicationMaster完成,总体来说,ApplicationMaster的主要功能是资源的调度、监控与容错。
2、YARN工作流程
(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的高可用
1、HDFS的高可用架构
在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 启动,使其成为活动状态去处理客户端请求,从而实现高可用。
四、Hadoop高可用集群的搭建
搭建虚拟机以及Zookeeper可参考作者之前的文章:
大数据技术之Hadoop学习(一)_雨诺风的博客-CSDN博客
大数据技术之Hadoop(五)——Zookeeper_雨诺风的博客-CSDN博客
1、部署集群节点
服务器 | 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 的健康状态。
五、配置高可用集群
1、修改 hadoop-env.sh 文件
找到这一行,修改jdk的路径
# The java implementation to use.
export JAVA_HOME=/export/servers/jdk
2、修改 core-site.xml 文件
<!-- 指定HDFS的nameservice为ns1,需要和hdfs-site.xml中的保持一致 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/export/servers/hadoop-2.10.1/tmpha</value> #为了便于同伪分布和分布式集群之间切换
</property>
<!-- 指定用于ZKFailoverController故障自动恢复的Zookeeper服务器地址,用逗号分隔 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01.bgd01:2181,hadoop02.bgd01:2181,hadoop03.bgd01:2181</value>
</property>
<!-- 指定 Zookeeper 集群服务器的 Host:Port 列表 -->
<property>
<name>hadoop.zk.address</name>
<value>hadoop01.bgd01:2181,hadoop02.bgd01:2181,hadoop03.bgd01:2181</value>
</property>
<!-- 指定 用于ZK故障恢复存储信息的ZooKeeper znode -->
<property>
<name>ha.zookeeper.parent-znode</name>
<value>/hadoop-ha</value>
</property>
3、修改 hdfs-site.xml 文件
<!-- 指定HDFS的副本数量 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 设置namenode.name目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/export/data/hadoop/name</value>
</property>
<!-- 设置namenode.data目录 -->
<property>
<name>dfs.namenode.data.dir</name>
<value>file:/export/data/hadoop/data</value>
</property>
<!-- 开启webHDFS -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!-- 指定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>hadoop01.bgd01:9000</value>
</property>
<!-- nn1的http通信地址,配置NameNode节点的Web页面访问地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hadoop01.bgd01:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hadoop02.bgd01:9000</value>
</property>
<!-- nn2的http通信地址,配置NameNode节点的Web页面访问地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hadoop02.bgd01:50070</value>
</property>
<!-- 指定NameNode的共享edits元数据在JournalNode上的存放位置,一般配置奇数个,以适应zk选举 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01.bgd01:8485;hadoop02.bgd01:8485;hadoop03.bgd01:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 ,JournalName用于存放元数据和状态信息的目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/export/data/hadoop/journaldata</value>
</property>
<property>
<name>ipc.client.connect.max.retries</name>
<value>30</value>ide
</property>
<!-- 开启NameNode失败自动重启 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 ,客户端与NameNode通讯的地址 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行,解决HA脑裂问题 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免密登录,上述属性ssh通讯使用的秘钥文件 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制连接超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>3000</value>
</property>
4、修改 mapred-site.xml 文件
先将mapred-site.xml.template 复制到 mapred-site.xml
<configuration>
<!-- 指定MapReduce运行时框架,这里指定在YARN上,默认是local -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
5、修改 yarn-site.xml 文件
<property>
<!-- 该节点上nodemanager可用的物理内存总量,默认是8192M,如果节点内存不够8GB,则需要调整,
否则NodeManager进程无法启动或者启动后自动结束 -->
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
</property>
<property>
<!-- 资源管理器中可分配的内存 -->
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
</property>
<property>
<!-- NodeManager 可以分配的CPU核数 -->
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>8</value>
</property>
<!-- 开启resourcemanager高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定resourcemanager的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定resourcemanager的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定resourcemanager的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop01.bgd01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop02.bgd01</value>
</property>
<!-- 指定rm的web访问地址的 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>${yarn.resourcemanager.hostname}:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>${yarn.resourcemanager.hostname}:8088</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
6、修改 slaves 文件
hadoop01.bgd01
hadoop02.bgd01
hadoop03.bgd01
7、分发配置文件
将/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"指令立即刷新配置文件。
五、启用Hadoop高可用集群
1、启动集群各个节点上的Zookeeper服务
zkServer.sh start
2、启动集群各个节点监控NameNode的管理日志的JournalNode
hadoop-daemons.sh start journalnode
注:只需在第一次初始化启动集群时运行一次。以后每次启动集群,journalnode会在步骤 5、start-dfs.sh中启动。
3、在hadoop01格式化NameNode,并将格式化后的目录复制到hadoop02中
hdfs namenode -format
(执行格式化指令后必须出现 successfulluy formatted 才表示格式化成功。)
scp -r /export/data/hadoop hadoop02.bgd01:/export/data/
4、在hadoop01格式化ZKFC
hdfs zkfc -formatZK
5、在Hadoop01上启动所有HDFS服务进程
start-dfs.sh
6、在Hadoop01上启动所有YARN服务进程
start-yarn.sh
7、查看服务进程
集群启动后,如果正常,执行命令
JPS
查看进程。
hadoop01上可以查看到如下进程:
NameNode
DFSZKFailoverController
ResourceManager
DataNode
Jps
JournalNode
NodeManager
QuorumPeerMain
hadoop02上可以查看到如下进程:
NameNode
DFSZKFailoverController
DataNode
Jps
JournalNode
NodeManager
QuorumPeerMain
hadoop03上可以查看到如下进程:
DataNode
Jps
JournalNode
NodeManager
QuorumPeerMain
六、关闭Hadoop集群
1、在Hadoop01上关闭所有YARN服务进程
stop-yarn.sh
2、在Hadoop01上关闭所有HDFS服务进程
stop-dfs.sh
3、在集群各个节点上的关闭Zookeeper服务
zkServer.sh stop
4、在hadoop01上执行命令关闭集群各个节点的JournalNode
hadoop-daemons.sh stop journalnode
5、对比:在集群各个节点关闭自身的JournalNode,执行命令
hadoop-daemon.sh stop journalnode
参考书籍:
《Hadoop大数据技术原理与应用》