一、HDFS
1.HDFS架构
HDFS是一个主/从(Master/Slave)体系结构,由三部分组成:NameNode和DataNode以及SecondaryNamenode:
- NameNode负责管理整个文件系统的元数据,比如文件名、文件目录结构、文件属性(生成时间、block副本数、权限)、block大小以及组成文件的block信息。
- DataNode负责文件数据块(block)的读写操作和复制操作,每一个数据块都可以在多个DataNode上存储多个副本,默认为3个。DataNode之间会进行通信,复制数据块。
- Secondary NameNode用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。最主要作用是辅助NameNode管理元数据信息。
NameNode | DataNode |
---|---|
存储元数据 | 存储文件内容 |
元数据保存在内存中 | 文件内容保存在硬盘 |
保存文件、block、DataNode之间的映射关系 | 维护block id到DataNode本地文件的映射关系 |
2.HDFS的特性
-
master/slave架构(主从架构)
HDFS采用master/slave架构。一般一个HDFS集群是由一个NameNode和多个DataNode组成。Namenode是集群主节点,两者共同完成分布式的文件存储服务。
-
分块存储
HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数来规定。
-
命名空间(NameSpace)
HDFS 支持传统的层次型文件组织结构。Namenode 负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被 Namenode 记录下来。
HDFS 会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。 -
NameNode元数据管理
目录结构及文件分块位置信息叫做元数据。NameNode负责维护整个 HDFS 文件系统的目录树结构,以及每一个文件所对应的 block 块信息(block 的 id,及所在的 DataNode 服务器)。
-
DataNode数据存储
文件的各个block的具体存储管理由DataNode节点承担。每一个 block 都可以在多个 DataNode 上。DataNode 需要定时向 NameNode 汇报自己持有的 block 信息。 存储多个副本(副本数量也可以通过参数设置 dfs.replication,默认是 3)
二、YARN
1. YARN架构
-
ResourceManager
RM是一个全局的资源管理器,负责整个系统的资源管理和分配,它主要由两个部分组成:调度器(Scheduler)和应用程序管理器(Application Manager)。
调度器根据容量、队列等限制条件,将系统中的资源分配给正在运行的应用程序,在保证容量、公平性和服务等级的前提下,优化集群资源利用率,让所有的资源都被充分利用 。
应用程序管理器负责管理整个系统中的所有的应用程序,包括应用程序的提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重启它。
-
ApplicationMaster
用户提交的一个应用程序会对应于一个ApplicationMaster,它的主要功能有:
- 与RM调度器协商以获得资源,资源以Container表示。
- 将得到的任务进一步分配给内部的任务。
- 与NM通信以启动/停止任务。
- 监控所有的内部任务状态,并在任务运行失败的时候重新为任务申请资源以重启任务。
-
NodeManager
NodeManager是每个节点上的资源和任务管理器,一方面,它会定期地向RM汇报本节点上的资源使用情况和各个Container的运行状态;另一方面,他接收并处理来自AM的Container启动和停止请求。
-
Container
Container是YARN中的资源抽象,封装了各种资源。一个应用程序会分配一个Container,这个应用程序只能使用这个Container中描述的资源。
2.YARN任务提交流程
当jobclient向YARN提交一个应用程序后,YARN将分两个阶段运行这个应用程序:一是启动ApplicationMaster;第二个阶段是由ApplicationMaster创建应用程序,为它申请资源,监控运行直到结束。
具体步骤如下:
- 用户向YARN提交一个应用程序,并指定ApplicationMaster程序、启动ApplicationMaster的命令、用户程序。
- RM为这个应用程序分配第一个Container,并与之对应的NM通讯,要求它在这个Container中启动应用程序ApplicationMaster。
- ApplicationMaster向RM注册,然后拆分为内部各个子任务,为各个内部任务申请资源,并监控这些任务的运行,直到结束。
- AM采用轮询的方式向RM申请和领取资源。
- RM为AM分配资源,以Container形式返回
- AM申请到资源后,便与之对应的NM通讯,要求NM启动任务。
- NodeManager为任务设置好运行环境,将任务启动命令写到一个脚本中,并通过运行这个脚本启动任务
- 各个任务向AM汇报自己的状态和进度,以便当任务失败时可以重启任务。
- 应用程序完成后,ApplicationMaster向ResourceManager注销并关闭自己