Yarn
YARN核心思想是将资源管理和任务的监控和调度分离
Yarn基础架构
- ResourceManager(RM):
- 整个集群资源的控制器
- 处理客户端的请求
- 监控NodeManager
- 启动和监控ApplicationMaster
- 资源的分配与调度
- NodeManager(NM):
- 单个节点的管理器,管理单个节点上的资源
- 处理来自ResourceManager的命令
- 处理来自ApplicationMaster的命令
- ApplicationMaster(AM):
- 单个任务的管理器
- 为应用程序向ResourceManager申请资源并分配给内部的任务
- 任务的监控与容错(监控MapTask与RedeceTask)
- Container:是Yarn资源的抽象,封装了某个节点上的多维度资源,入内存、CPU、磁盘、网络等
Yarn工作机制
-
客户端提交作业,向RM申请jobId
-
RM返回applicationId和应用程序的资源提交路径给客户端
-
客户端根据返回的信息,检查作业的输入输出目录是否正确,计算作业分片是否正常,将运行作业所需要的资源(job.xml,job.split,Jar包)上传到返回的HDFS路径
-
上传成功后,向RM正式提交作业,请求执行作业,申请运行ApplicationMaster
-
RM将请求信息传递给自己的调度器Scheduler,请求分配一个Container来执行作业
-
调度器会将任务放入调度队列,当执行到相应的请求时,会通知ApplicationMaster分配容器,调用NodeManager开辟的Container,创建作业对应的ApplicationMaster
-
ApplicationManager与指定的NodeManager通信,要求开辟Container启动ApplicationMaster
-
ApplicationMaster获取HDFS上提交的作业,根据切片信息创建MapTask和ReduceTask
-
ApplicationMaster向调度器申请MapTask和ReduceTask所需要的资源
-
调度器返回ApplicationMaster所需要的资源,分片给它两个NodeManager,分别领取任务并创建容器
-
ApplicationMaster与对应的NodeManager通信申请Container启动任务
-
NodeManager启动MapTask,ApplicationMaster等待所有的MapTask运行完毕后,另一个NodeManager开启ReduceTask任务
-
ReduceTask向MapTask拉取相应分区的数据,接收共享的文件数据
-
运行过程中,任务会将状态和进度报告给ApplicationMaster,Client会从ApplicationMaster获取状态。运行完毕后,MR会向RM申请注销自己,容器Container与ApplicationMaster也会注销自己,释放资源
Yarn调度器与调度算法
Hadoop作业调度器:
- FirstInFirstOut(FIFO)先进先出调度器:
- Capacity Scheduler容量调度器:ApacheHadop的默认调度器
- Fair Scheduler公平调度器:CDH框架的默认调度器
FIFO调度器:
单队列,根据作业的提交先后顺序,先提交的先服务;一般不使用
Capacity Scheduler容量调度器:
- 多队列:每个队列可配置一定的资源量,每个队列采用FIFO调度策略,即优先满足先进入的任务。
- 容量保证:管理员可为每个队列设置资源最低保证和资源使用上限
- 灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用 程序提交,则其他队列借调的资源会归还给该队列。
- 多租户:
- 支持多用户共享集群和多应用程序同时运行。
- 为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定
容量调度器资源分配算法:
- 队列资源分配,谁的资源占比最少,优先执行谁;
- 作业资源分配,如何对作业设置了优先级,按照优先级顺序分配,如果没有设置优先级,按照作业提交时间分配;
- 容器资源分配,如何对容器设置了优先级,按照优先级顺序分配,如果没有设置优先级,按照任务与数据的距离大小分配,距离越近先分配;
Fair Scheduler公平调度器
- 与容量调度器相同点:
- 多队列:支持多队列多作业。
- 容量保证:管理员可为每个队列设置资源最低保证和资源使用上限。
- 灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
- 多租户:支持多用户共享集群和多应用程序同时运行;为了防止同一个用户的作业独占队列中的资源,该调度器 会对同一用户提交的作业所占资源量进行限定。
- 与容量调度器不同的:
- 核心调度策略不同:
- 容量调度器优先选择资源利用率低的队列
- 公平调度器优先选择对资源的缺额比例大
- 每个队列可以单独设置资源分配方式
- 容量调度器:FIFO、DRF
- 公平调度器:FIFO、DRF、FAIR
- 核心调度策略不同:
- 缺额:公平调度器设计目标是:在时间尺度上,所有作业获得公平的资源。当多作业运行时,又添加一个作业,系统需要一定时间才能给新添加的作业分配资源,这个时间差叫缺额。调度器会优先为缺额大的作业分配资源。
- 公平调度器队列资源分配方式:
- FIFO策略:此时公平调度器相当于容量调度器。
- Fair策略:Fair 策略(默认)是一种基于最大最小公平算法实现的资源多路复用方式,默认情况下,每个队列内部采用该方式分配资 源。这意味着,如果一个队列中有两个应用程序同时运行,则每个应用程序可得到1/2的资源;如果三个应用程序同时运行,则 每个应用程序可得到1/3的资源。
- Fair策略资源分配流程与容量调度器一致,队列->作业->容器;均按照公平策略分配资源
- 实际最小资源份额:minshare=(资源需求量,配置的最小资源)
- 是否饥饿:isNeedy=资源使用量<minshare(实际最小资源份额)
- 资源分配比:minShareRatio=资源使用量/Max(minshare,1)