我们都知道Hadoop诞生的目标是为了支持十几台机器的搜索服务,但是随着数据的增加,数据的可用性也是一个待解决的问题。但是Hadoop框架的自身问题限制了集群的发展。
首先是,JobTracker和NameNode的单点问题,严重制约了集群的扩展和可靠性。
其次我们通过:
知道。MapReduce采用了基于slot的资源分配模型,slot是一种粗粒度的资源 划分单位,通常一个任务不会用完槽位对应的资源,且其他任务也无法使用这些空闲资源,同时map的槽位和reduce的槽位是不可以通用的。会导致部分资源紧张,部分资源空闲。
同时为了满足在线计算等新的计算框架,MapReduce这种离线计算框架已经不能满足需求。
Yarn框架
JobTracker在 YARN 中JobTracker大约分成了 3 块:
- 一部分是 ResourceManager,负责 Scheduler 及 ApplicationsManager;
- 一部分是 ApplicationMaster,负责 job 的生命周期管理;
- 最后一部分是 JobHistroyServer,负责日志的展 示。 为了支持更多的计算模型,把以前的 TaskTracker 替换成了 NodeManager。NodeManager 管理各种各样的 container。Container 才是真正干活的。计算模型相关的事情可以放在 NodeManager 的一个扩展服务中,如 MAP-REDUCE 的 shuffle。
各大模块分析
ResourceManager
RM 是一个全局的资源管理器,负责整个系统的资源管理和分配,包括 scheduler 和 Application Manager, NM Manager
对调度器来说,YARN 提供了多种直接可用的调度器, Fair Scheduler 和 Capacity Scheduler 等。调度器仅根据各个应用程序的资源需 求进行资源分配,分配的基本单位是Container,而容器里面是将内存,CPU,网络,磁盘封装到一起。
同时用户也可设计自己的调度器。
ApplicationMaster
对应用程序管理器来说,,包括应用程序提交、与调度器协商 资源以启动 ApplicationMaster、监控 ApplicationMaster 运行状态并在失败时重新启动它等。用户提交的每个应用程序均包含一个 ApplicationMaster,ApplicationMaster可以与RM协商获取资源,也可以将得到的任务进行再分配,与NM通信,同时可以监控所有的任务状态。
NodeManager
NodeManager 管理 container、资源下载、健康检测后汇报 对节点管理器来说,NM是每个节点上的资源和任务管理器,一方面,它会定时地向 RM 汇报本节点上的 资源使用情况和各个 Container 的运行状态;另一方面,它接收并处理来自 AM 的 Container 启动 / 停止等各种请求。
Container
Container 是 YARN 中的资源抽象,它封装了某个节点上的多维度资源,如内存、 CPU、磁盘、网络等,当 AM 向 RM 申请资源时,RM 为 AM 返回的资源便是用 Container 表示的。YARN 会为每个任务分配一个 Container,且该任务只能使用该 Container 中描述的 资源。容器是一个动态划分资源。
Jobhistory 机制
在 MRv1 中,JobHistroy server 是嵌入在 Jobtracker 中的,当有大量的查询 时,对 Jobtracker 造成很大的压力.Yarn中实现一套单独的 JobHistroy server 服务。AggregatedLogDeletionService:日志文件的 管理。 HistoryClientService:提供一些服务供 JobClient 查询。
Yarn工作流程
- 1.用户向 YARN 中提交应用程序,其中包括 ApplicationMaster 程序、启动 ApplicationMaster 的命令、用户程序等。
- 2.ResourceManager 为该应用程序分配第一个 Container,并与对应的 NodeManager 通信,要求它在这个 Container 中启动应用程序的 ApplicationMaster。
- 3 ApplicationMaster 首先向 ResourceManager 注册,这样用户可以直接通过 ResourceManage 查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运 行状态,直到运行结束,即重复步骤 4~7。
- 4 ApplicationMaster 采用轮询的方式通过 RPC 协议向 ResourceManager 申请和 领取资源。 步骤
- 5. 一旦 ApplicationMaster 申请到资源后,便与对应的 NodeManager 通信,要求 它启动任务。
- 6. NodeManager 为任务设置好运行环境(包括环境变量、JAR 包、二进制程序 等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
- 7. 各个任务通过某个 RPC 协议向 ApplicationMaster 汇报自己的状态和进度,以 让 ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。 在应用程序运行过程中,用户可随时通过 RPC 向 ApplicationMaster 查询应用程序的当 前运行状态。
- 8. 应用程序运行完成后, ApplicationMaster 向 ResourceManager 注销并关闭自己。