概述
YARN(Yet Another Resource Negotiator)
Yarn是一个分布式的资源管理系统,用于提高分布式的集群环境下的资源利用率,这些资源包括内存、IO、网络、磁盘等。其产生的原因是为了解决原MapReduce框架的不足。最初MapReduce的committer还可以周期性的在已有的代码上进行修改,可是随着代码的增加以及原MapReduce框架设计的不足,在原MapReduce框架上进行修改变得越来越困难,所以MapReduce的committer决定从架构上重新设计MapReduce,使下一代的MapReduce(MRv2/Yarn)框架具有更好的扩展性、可用性、可靠性、向后兼容性和更高的资源利用率,以及能支持除了MapReduce计算框架外的更多的计算框架
架构
ResourceManager
:RM是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)
NodeManager
:NM是每个节点上的资源和任务管理器,一方面,它会定时地向RM汇报本节点上的资源使用情况和各个Container的运行状态;另一方面,它会接收并处理来自AM的Container启动/停止等各种请求
ApplicationMaster(AM)
:
用户提交的每个应用程序均包含一个AM,主要功能包括:
- 与RM调度器协商以获取资源(用Container表示)
- 将得到的资源进一步分配给内部任务
- 与NM通信以启动/停止任务
- 监控所有任务的运行状态,并在任务运行失败时重新为任务申请资源以重启任务
YARN Child
:负责做实际计算任务
Container:
Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用Container表示的
YARN的Job提交流程
MR on yarn执行流程
- 运行MapReduce任务,启动JVM进程RunJar,实例化MapReduce Job任务实例
- Job任务实例,请求Yarn集群ResourceManger注册应用信息,并且返回一个应用标示JobId
- Job任务实例,将任务资源(jar包、配置文件、计算数据切片信息)等拷贝到共享的HDFS文件系统中【移步计算而不是数据】
- 提交Job,交给ResourceManger进行调度处理【之后,所有操作发生在Yarn集群中】
- Yarn集群的ResourceManager【负责统筹管理分布式集群资源和任务调度】会在一台空间的NodeManger启动一个容器MRAppMaster【负责当前Job监控管理、故障恢复】
- MRAppMaster 进一步初始化Job【计算ReduceTask任务数量 默认1 或者手动设定】
- MRAppMaster从共享的文件系统HDFS中获取数据切片的信息【计算MapTask任务数量】
- MRAppMaster请求Yarn集群的资源管理器分配相应单位(MapTask + ReduceTask = 申请的计算容器的数量)的计算资源
- MRAppMaster会在ResourceManager分配的NodeManager上启动对应数量计算容器JVM进程(YARNChild:Contaniner 运行MapTask或者ReduceTask)
- YarnChild会接收负责计算数据以及获取执行的jar包
- 在YarnChild JVM进程中运行在MapTask或者ReduceTask
- 将计算结果存放到存储系统,并且释放所占用的计算资源
Spark on yarn(cluster)
- client 向 yarn 提交一个job
- ResouceManager 为该job在某个 NodeManager 上分配一个 ApplicationMaster,NM启动ApplicationMaster,ApplicationMaster启动 driver(sparkContext)
- ApplicationMaster 启动后完成初始化作业,driver 生成DAG 图,DAG scheduler 将DAG 拆分成 stage (TaskSet)发送给 Task Scheduler
- AM 向 RM 申请资源,RM 返回 Executo r信息
- AM 通过 rpc 启动相应的 sparkExecutor
- Driver 向 Executor 分配 task
- Executor 执行结果写入文件或返回 driver 端
Spark on yarn(client)
- 客户端启动后直接运行应用程序,直接启动 driver,并初始化
- 客户端将 job 发布到 yarn 上
- RM 为该job 在某个 NM 分配一个 AM
- AM 向 RM 申请资源,RM 返回Executor 信息
- AM 通过 RPC 启动相应的 Executor
- driver 生成DAG 图,DAG scheduler 将DAG 拆分成 stage (TaskSet)发送给 Task Scheduler
- Driver 向 Executor 分配 task
- Executor 执行task 并将结果写入第三方存储系统或者 Driver 端
yarn-cluster和yarn-client模式的区别:
- yarn-cluster模式下,driver运行在AM中,它负责向YARN申请资源,并监督作业的运行状况。
当用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行,显然yarn-cluster模式不适合运行交互类型的作业 - yarn-client模式下,ApplicationMaster仅仅向YARN请求executor,client会和请求的container通信来调度他们工作,也就是说Client不能离开