`
- 浏览:
112580 次
- 性别:
- 来自:
合肥
-
这里要把握好两条主线:
1. ApplicationMasterService
通过重载ApplicationMasterProtocol的AllocateResponse allocate(AllocateRequest request)方法实现了AppMaster的远程资源请求,同时
也是兼具心跳作用。
AllocateResponse allocate(AllocateRequest request){
...
// Send new requests to appAttempt.
Allocation allocation =
this.rScheduler.allocate(appAttemptId, ask, release,
blacklistAdditions, blacklistRemovals); //ask是请求的资源,release是AM释放的资源...
...
}
以FairScheduler的 public Allocation allocate(ApplicationAttemptId appAttemptId,
List<ResourceRequest> ask, List<ContainerId> release, List<String> blacklistAdditions, List<String> blacklistRemovals)
为例,
public Allocation allocate(ApplicationAttemptId appAttemptId,
List<ResourceRequest> ask, List<ContainerId> release, List<String> blacklistAdditions, List<String> blacklistRemovals)
{
...
//释放资源
for (ContainerId releasedContainerId : release) {
...
}
// Update application requests
application.updateResourceRequests(ask); //获取
。。。
return new Allocation(application.pullNewlyAllocatedContainers(),
application.getHeadroom(), preemptionContainerIds);
//这里application.pullNewlyAllocatedContainers()是因为在分配时RMContainer org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FSSchedulerApp.allocate(NodeType type, FSSchedulerNode node, Priority priority, ResourceRequest
request, Container container)就已经将新分配的容器写入FSSchedulerApp
的newlyAllocatedContainers对象了,这时候返回直接取就行,这样就把已经分配的容器信息返回给了AM,AM在据此去NM上启动相应
的Container
}
这是该方法
public synchronized void updateResourceRequests(
List<ResourceRequest> requests) {
this.appSchedulingInfo.updateResourceRequests(requests);
}
一路跟进:
void org.apache.hadoop.yarn.server.resourcemanager.scheduler.AppSchedulingInfo.updateResourceRequests(List<ResourceRequest> requests) //更新该应用的资源请求
updateResourceRequests(List<ResourceRequest> requests){
for (ResourceRequest request : requests) {
Priority priority = request.getPriority();
String resourceName = request.getResourceName(); //
...
Map<String, ResourceRequest> asks = this.requests.get(priority);
...
asks.put(resourceName, request);
...
}
}
该方法的作用就是更新该应用的不同的优先级的请求列表,
final Map<Priority, Map<String, ResourceRequest>> requests =
new HashMap<Priority, Map<String, ResourceRequest>>();
以上,就完成了这次AppMaster请求的大致内容,更新appSchedulingInfo的不同优先级的请求Map.
2. FairScheduler
就是分配,就沿着FairScheduler的public void handle(SchedulerEvent event) 中的case NODE_UPDATE:一路看下去就行,
Resource org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.AppSchedulable.assignContainer(FSSchedulerNode node, boolean reserved)函数
assignContainer(FSSchedulerNode node, boolean reserved) {
...
for (Priority priority : prioritiesToTry) {
app.addSchedulingOpportunity(priority); //统计该应用不同优先级的被调度次数,每一次调度+1,若本次调度成功则清0
ResourceRequest rackLocalRequest = app.getResourceRequest(priority,node.getRackName());
ResourceRequest localRequest = app.getResourceRequest(priority,node.getNodeName()); //获取该应用的当前优先级下,这个节点的所有本地性请求
NodeType allowedLocality = app.getAllowedLocalityLevel(priority,
scheduler.getNumClusterNodes(), scheduler.getNodeLocalityThreshold(),
scheduler.getRackLocalityThreshold());// allowedLocality很重要,关系到后面的delay调度
if(rackLocalRequest != null && rackLocalRequest.getNumContainers() != 0
&& localRequest != null && localRequest.getNumContainers() != 0) {
return assignContainer(node, priority,
localRequest, NodeType.NODE_LOCAL, reserved);
}
....
}
}
//资源分配最重要的函数,如果能分配就分,不能就预留
private Resource assignContainer(FSSchedulerNode node,
Priority priority, ResourceRequest request, NodeType type,
boolean reserved) {
// How much does this request need?
Resource capability = request.getCapability();
// How much does the node have?
Resource available = node.getAvailableResource();
Container container = null;
if (reserved) {
container = node.getReservedContainer().getContainer();
} else {
container = createContainer(app, node, capability, priority);
}
// Can we allocate a container on this node?
if (Resources.fitsIn(capability, available)) {
// Inform the application of the new container for this request
RMContainer allocatedContainer =
app.allocate(type, node, priority, request, container);
if (allocatedContainer == null) {
// Did the application need this resource?
if (reserved) {
unreserve(priority, node);
}
return Resources.none();
}
// If we had previously made a reservation, delete it
if (reserved) {
unreserve(priority, node);
}
// Inform the node
node.allocateContainer(app.getApplicationId(),
allocatedContainer);
return container.getResource();
} else {
// The desired container won't fit here, so reserve
reserve(priority, node, container, reserved);
return FairScheduler.CONTAINER_RESERVED;
}
}
NM context中的container记录了所有容器的信息
还有就是新版本的delay改成了次数,相比老版本的时间delay,个人觉得都差不多。
这样, RM一边通过FairScheduler分配资源,一边通过ApplicationMasterService返回分配的资源信息,完成了整套流程。
这里有个问题是RackLocal Request分配后,AM如何知道?
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
当第二个小任务提交后,Fair 调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。 Fair Scheduler 的优点是: * 公平调度器,就是能够共享整个集群的资源 * 不用预先占用资源,每一个作业都是...
YARN 调度流程主要分为三个阶段:资源申请、资源分配和任务执行。 资源申请阶段 在资源申请阶段,客户端会向 ResourceManager 提交应用程序的请求,包括应用程序的名称、版本、资源需求等信息。ResourceManager 会...
YARN资源调度器是Hadoop YARN中最核心的组件之一,负责整个集群资源的管理和分配。 YARN资源调度器的功能: 1. 资源管理:YARN资源调度器负责管理整个集群的资源,包括CPU、内存、磁盘存储等。 2. 资源分配:YARN...
YARN的资源分配算法是Dominant Resource Fairness(DRF),它考虑多个资源维度,如CPU和内存,将最大资源需求作为主资源,并在主资源上实现最小公平分配。这确保了多任务环境中的资源公平性。 资源保证机制方面,...
它可以是基于应用或者队列来实现公平分配。应用可以被分配到不同的队列,每个队列内部和队列之间都可以实现公平调度。通过调整配置,可以定义“公平”的具体含义,如按需分配、按比例分配等。启用Fair Scheduler需要...
spark-2.2.0-yarn-shuffle.jar
Hadoop的资源管理系统YARN虽然提供了三种内置的资源调度器(FIFO Scheduler、Capacity Scheduler和Fair Scheduler),但在实际应用过程中,随着业务需求的增长和应用场景的多样化,这些内置调度器往往无法完全满足...
3. Fair Scheduler:动态公平分配资源,可以按需创建队列,每个队列内部保证资源的公平分配。 四、标签调度(Labeling) YARN引入标签调度,允许管理员为节点打上标签,通过标签将节点分组,使应用程序可以根据...
* FIFO 调度器:是 YARN 的默认调度器,所有用户共享,分配资源先到先得,没有优先级之分。 * Capacity Scheduler:以队列为单位划分资源,每个队列有独立的资源,队列的结构和资源是可以进行配置的。 * Fair ...
【Yarn资源调度器】是Hadoop大数据处理框架的核心组件之一,主要负责集群资源的管理和分配,确保高效、公平地运行各种计算任务。本课程详细介绍了Yarn的基本架构、工作机制、调度器及调度算法,以及如何进行实际操作...
在Hadoop集群中,YARN(Yet Another Resource Negotiator)作为资源管理器,负责调度MapReduce任务的内存和CPU资源。YARN支持基于内存和CPU的两种资源调度策略,以确保集群资源的有效利用。在非默认配置下,合理地...
文章详细介绍了原有YARN作业调度方案的工作原理,即作业提交到YARN后,会被分配到中心调度器管理的调度队列上,再由调度器进行资源的分配。中心调度器在分配资源时,依据作业的提交顺序(先进先出)进行资源分配,并...
容量调度器允许管理员在资源分配中设定容量保证和资源共享,它支持多租户环境,使得多个组织或用户可以共享同一个YARN集群,同时能够确保资源的公平分配。公平调度器则强调的是资源分配的公平性,它根据资源的使用...
【Yarn工作机制和作业提交流程】是Hadoop生态系统中至关重要的一部分,它负责管理和调度分布式计算资源,确保高效地执行MapReduce等运算程序。Yarn,全称Yet Another Resource Negotiator,是一个资源调度平台,它的...
本文介绍的基于YARN(Yet Another Resource Negotiator)的分布式资源动态调度与协同分配系统,针对传统分布式资源调度框架Storm on YARN的不足,提出了一种新的解决方案。 首先,分布式资源调度框架Storm on YARN...
1. ResourceManager(RM):RM是全局资源调度器,负责决定应用程序的容器(Container)分配。`yarn.scheduler.minimum-allocation-mb`和`yarn.scheduler.maximum-allocation-mb`分别定义了每个Container可申请的最小...
Mapreduce分布式计算组件和YARN分布式资源调度
### YARN基本运作流程 #### 一、概述 Apache Hadoop YARN(Yet Another Resource Negotiator)是一个通用的资源管理和调度框架,它为Hadoop带来了更强大的可扩展性和灵活性。YARN不仅支持MapReduce,还能运行其他...
3. FairScheduler多用户调度器:它提供了更为公平的资源共享,通过动态调整每个用户或应用程序所得到的资源比例,使所有作业都能获得公平的资源分配,特别适合于共享环境下的作业调度。 Hadoop调度器的功能还包括了...
在YARN中,资源调度器扮演着非常关键的角色,它决定了各个应用程序如何公平、高效地获取计算资源。YARN支持多种调度器,包括CapacityScheduler和FairScheduler。CapacityScheduler是为大数据处理设计的,它允许资源...