Apache Hadoop YARN及 Hadoop部分内容视频学习笔记
Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度。
1 Yarn 三大组件
YARN 是一个资源管理、任务调度的框架,主要包含三大模块:ResourceManager(RM)、NodeManager(NM)、ApplicationMaster(AM)。
1.1 ResourceManager
ResourceManager 负责整个集群的资源管理和分配,是一个全局的资源管理系统。NodeManager 以心跳的方式向ResourceManager 汇报资源使用情况。RM 只接受 NM 的资源回报信息,对于具体的资源处理则交给 NM 自己处理。
1.2 NodeManager
NodeManager 是每个节点上的资源和任务管理器,它是管理这台机器的代理,负责该节点程序的运行,以及该节点资源的管理和监控。YARN 集群每个节点都运行一个 NodeManager。
NodeManager 定时向 ResourceManager 汇报本节点资源(cpu、内存)的使用情况和 Container 的运行状态。当 ResourceManager 宕机时 NodeManager 自动连接 RM 备用节
点。 NodeManager 接收并处理来自 ApplicationMaster 的 Container 启动、停止等各种请求。
1.3 ApplicationMaster
用 户 提 交 的 每 个 应 用 程 序 均 包 含 一 个 ApplicationMaster , 它 可 以 运 行 在 ResourceManager 以外的机器上。ApplicationMaster 负责与 RM 调度器协商以获取资源(用 Container 表示)。 将得到的任务进一步分配给内部的任务(资源的二次分配)。
2 Yarn 运行流程
具体流程如下:
1.发起请求,申请资源用于运行本次程序得ApplicationMaster(MrAppMaster)。
2.rm接受请求,通过NM找出符合申请资源得机器位置NM1,返回给客户端。
3.返回给运行AppMaster的容器位置,给你一个job的id编号以及job提交资源的路径。
4.客户端到指定的返回位置启动本次应用Master,并且把资源提交到指定的路径下。
5.启动完毕,向rm注册自己,并且保持联系。
6.MrAppmaster到指定位置读取本次mr的切片规划,申请响应数量的容器运行Maptask。
7.MrAppMaster向RM申请对应数量的容器运行本次Maptask。
8.接收请求,通过NMs返回相应可用容器的位置。
9.MrAppMaster到返回的机器上启动Maptask,并且监视Maptask的执行情况。
10.当Maptask运行结束,MrAppMaster向RM汇报哪些资源已经使用完毕并回收。
11.如果程序有下一个阶段(reducetask),MrAppMaster就会按照上述流程走一遍。
12.当本次程序的所有Task运行完毕,MrAppMaster向RM申请本次应用运行完毕,把自己注销掉。
3 Yarn 调度器
理想情况下,我们应用对 Yarn 资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源。在 Yarn 中,负责给应用分配资源的就是 Scheduler。
在 Yarn 中有三种调度器可以选择:FIFO Scheduler,Capacity Scheduler,Fairscheduler。
3.1 FIFO Scheduler
FIFO Scheduler 把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
FIFO Scheduler 是最简单也是最容易理解的调度器,也不需要任何配置,但它并不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。
3.2 Capacity Scheduler
Capacity 调度器允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。除此之外,队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。
3.3 Fair Scheduler
在 Fair 调度器中,我们不需要预先占用一定的系统资源,Fair 调度器会为所有运行的 job 动态的调整系统资源。也就是说当第一个大 job 提交时,只有这一个 job 在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair 调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。
关于队列的设置,这取决于我们具体的应用。如果我们没有定义任何队列,所有的应用将会放在一个 default 队列中。注意:对于 Capacity 调度器,我们的队列名必须是队列树中的最后一部分,如果我们使用队列树则不会被识别。
4 HDFS 元数据管理机制
4.1 元数据目录
HDFS 元数据,按类型分,主要包括以下几个部分:
1.文件、目录自身的属性信息,例如文件名,目录名,修改信息等。
2.文件记录的信息的存储相关的信息,例如存储块信息,分块情况,副本个数等。
3.记录 HDFS 的 Datanode 的信息,用于 Datanode 的管理。
为了客户响应查询方便,hdfs架构的时候把元数据放在内存中。因为内存中数据更新、查询快,极大缩短了操作响应时间;但是内存中元数据丢失风险颇高(断电等),因此辅佐元数据镜像文件(fsimage)+编辑日志文件(edits)的备份机制进行确保元数据的安全。
fsimage 镜像文件:是元数据的一个持久化的检查点,包含 Hadoop 文件系统中的所有目录和文件元数据信息,但不包含文件块位置的信息。文件块位置信息只存储在内存中,是在 datanode 加入集群的时候,namenode 询问 datanode 得的,并且间断的更新。
Edits 编辑日志:存放的是 Hadoop 文件系统的所有更改操作(文件创建,删除或修改)的日志,文件系统客户端执行的更改操作首先会被记录到 edits 文件中。
为了保证上次持久化镜像文件之后和这次持久化之前出问题,通过 edits log 记录发送的所有事务性操作。
在这种机制下,如果机器挂掉,恢复过程如下:
1.恢复镜像文件;
2.按照日志中的记录逐个重演一遍,直至数据恢复。
4.2 secondary namenode
当 HDFS 集群运行一段事件后,就会出现下面一些问题:
1.fsimage 文件非常旧
2.edit logs 文件会变的很大
3.NameNode 重启会花费很长时间,因为有很多改动要合并到 fsimage 文件上。
为了克服这个问题,我们需要一个易于管理的机制来帮助我们减小 edit logs 文件的大小和得到一个最新的 fsimage 文件,这样也会减小在 NameNode 上的压力。
SecondaryNameNode 就是来帮助解决上述问题的,它的职责是合并 NameNode 的 edit logs 到 fsimage 文件中。
4.3 Checkpoint
每达到触发条件,会由 secondary namenode 将 namenode 上积累的所有 edits 和一个最新的 fsimage 下载到本地,并加载到内存进行 merge(这个过程称为 checkpoint),如下图所示:
2.SNN把旧的 fsimage 和之间的edits log 拉取到自己运行的机器上。
3.SNN首先把旧的 fsimage 加载到内存,然后按照 edits log 重演一遍。
4.重演完毕,SNN 内存里的数据变成新的。
5.把新的元数据持久化成为新的 fsimage 文件。
如果 NameNode 中的 fsimage 真的出问题了,还是可以用 SecondaryNamenode 中的 fsimage 替换一下 NameNode 上的 fsimage,虽然已经不是最新的 fsimage,但是我们可以将损失减小到最少。
5 HDFS 安全模式
安全模式是 HDFS 所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求,是一种保护机制,用于保证集群中的数据块的安全性。
在 NameNode 主节点启动时,HDFS 首先进入安全模式,集群会开始检查数据块的完整性。Datanode 在启动的时候会向 namenode 汇报可用的 block 信息,当整个系统达到安全标准
时,HDFS 自动离开安全模式。
如果 HDFS 处于安全模式下,不允许 HDFS 客户端进行任何修改文件的操作,包括上传文件,删除文件,重命名,创建文件夹,修改副本数等操作。
总结一下,要离开安全模式,需要满足以下条件:
1)达到副本数量要求的 block 比例满足要求;
2)可用的 datanode 节点数满足配置的数量要求;
3) 1、2 两个条件满足后维持的时间达到配置的要求。
手动进入安全模式
hdfs dfsadmin -safemode enter
手动进入安全模式对于集群维护或者升级的时候非常有用,因为这时候 HDFS 上的数据是只读的。手动退出安全模式可以用下面命令:
hdfs dfsadmin -safemode leave
如果你想获取到集群是否处于安全模式,可以用下面的命令获取:
hdfs dfsadmin -safemode get
(也可在 web 页面查看安全模式状态)
如果自动进入安全模式,基本上是集群在进行数据块的构建。
6 Hadoop Archives
HDFS 并不擅长存储小文件,因为每个文件最少一个 block,每个 block 的元数据都会在 NameNode 占用内存,如果存在大量的小文件,它们会吃掉 NameNode 节点的大量内存。Hadoop Archives 可以有效的处理以上问题,它可以把多个文件归档成为一个文件,归档成一个文件后还可以透明的访问每一个文件。
6.1 创建 Archives(档案)
hadoop archive -archiveName name -p /欲建档文件路径 /建档目标路径 <dest>
archive 的名字的扩展名应该是*.har。
6.2 查看 Archives
首先我们来看下创建好的 har 文件。使用如下的命令:
hadoop fs -ls /目标文件
然后可以看到 har 文件包括:两个索引文件,多个 part 文件以及一个标识成功与否的文件。part 文件是多个原文件的集合,根据 index 文件去找到原文件。
har://scheme-hostname:port/archivepath/fileinarchive
scheme-hostname 格式为 hdfs-域名:端口,如果没有提供 scheme-hostname,它会使用默认的文件系统。这种情况下 URI 是这种形式:
har:///archivepath/fileinarchive
6.3 解压 Archives
按顺序解压存档(串行):
Hadoop fs -cp har:///档案文件 hdfs:/欲解压的新路径
要并行解压存档,请使用 distCp:
hadoop distcp har:///档案文件 hdfs:/欲解压的新路径
注意:
- Hadoop archives 是特殊的档案格式。一个 Hadoop archive 对应一个文件系统目录。Hadoop archive 的扩展名是*.har;
- 创建 archives 本质是运行一个 Map/Reduce 任务,所以应该在 Hadoop集群上运行创建档案的命令;
- 创建 archive 文件要消耗和原文件一样多的硬盘空间;
- archive 文件不支持压缩,尽管 archive 文件看起来像已经被压缩过;
- archive 文件一旦创建就无法改变,要修改的话,需要创建新的archive 文件。
- 当创建 archive 时,源文件不会被更改或删除;
- 虽然 HAR 文件可以作为 MR 的输入,但是由于 InputFormat 类并不知道文件已经存档,所以即使在 HAR 文件里处理许多小文件,仍然低效。
7 Hadoop High Availability
HA(High Available), 高可用,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,分为活动节点(Active)及备用节点(Standby)。通常把正在执行业务的称为活动节点,而作为活动节点的一个备份的则称为备用节点。当活动节点出现问题,导致正在运行的业务(任务)不能正常运行时,备用节点此时就会侦测到,并立即接续活动节点来执行业务。从而实现业务的不中断或短暂中断。
单点故障:一个程序或者一个服务由众多的模块组成,当中一个出现故障使得整体不可用。这种故障叫做单点故障。
解决方案:主备集群,通常是一主一备,同一时刻有且只有一个活跃的。
脑裂:主备之间信息不顺畅,导致主备之间互认为对方挂掉或者或者。造成集群无主或者集群多主的情况。因此要保证主备之间的信息是同步的。
7.1 QJM/Qurom Journal Manager
7.1.1 QJM如何避免脑裂发生
HA 模式下,会将 FailoverController 部署在每个 NameNode 的节点上,作为一个单独的进程用来监视 NN 的健康状态。并且可以通过zk进行主备切换。具体步骤如下:
1.两个zkfc到zk集群注册指定的节点(非序列化,短暂),谁创建成功,谁对应的那台机器的NN就是active状态。创建失败的zkfc在此节点设置exist(node)的监听。
2.如果active发现自己监控的NN出现了健康问题,断开自己与zk的连接之前所创建的节点消失,触发监听,standby对应的zkfc就会收到监听。
3.standby的NN并不会马上把自己切换为active,首先shh到active的那台机器上进行远程登陆,杀死那个节点。再把自己切换为active。
4.如果之前的那个active又修复好了,启动之后首先它的zkfc去创建节点,但是节点存在,设置监听,把自己变成standby。
7.1.2 QJM如何保证主备之间的信息是同步
数据共享同步的核心:共享操作日志,备跟着主重演一遍操作记录。
核心:使用JN集群进行edits log 的共享,写入过半即认为成功。步骤如下:
1.客户端连接active nn进行hdfs操作,首先把edits log写入JN集群中,写入过半即认为成功,standby感知JN集群数据的变化,读取edits log 重演操作记录,使得元数据准实时同步。
8 Hadoop Federation
单 NameNode 的架构使得 HDFS 在集群扩展性和性能上都有潜在的问题,当集群大到一定程度后,NameNode 进程使用的内存可能会达到上百 G,会造成内存不足的问题。因而提出了 namenode 水平扩展方案-- Federation。
namespaceID/clusterID/blockpoolID 这些都是 HDFS 集群的唯一标识符。标识符被用来防止 Datanodes 意外注册到另一个集群中的 namenode 上。这些标识在联邦(federation)部署中特别重要。联邦模式下,会有多个 NameNode 独立工作。