Spark on yarn CapacityScheduler中的ResourceCalculator(资源计算器)

首先,是一个实际的问题(为了方便描述考虑一个简单的情况):

在spark on yarn上面进行资源申请,我们申请了10个container(每个container都是1G内存,1个core),这是集群中有一个nodemanager,有10G内存,5个core。

在默认配置情况下,yarn就有可能将这10个container都发送到这个nodemanager上(即使集群上还有其他nodemanager有资源空闲),这就会导致,有5个container需要等到另外5个container用完core之后才能执行其自己的任务。

上述问题,出现的原因就是CapacityScheduler在计算集群可用资源的时候,默认使用的是DefaultResourceCalculator这个资源计算器,而该资源计算器,存在一个很大的问题,就是在计算可用资源量的时候只考虑到了内存这一单个维度的资源情况。

public  int  computeAvailableContainers(Resource available, Resource required) {
return  available.getMemory() / required.getMemory();
   }

 

所以在上述问题nodemanager内存够用的情况下,就出现了其他container空等core的情况。

 

在这种情况下,我们应该考虑使用DominantResourceCalculator,该资源计算器在计算资源的时候会综合考虑cpu和内存的情况,来决定yarn最后的调度。

通过配置 capacity-scheduler.xml 来进行资源计算器的配置

< property >
   < name >yarn.scheduler.capacity.resource-calculator name >
   < value >org.apache.hadoop.yarn.util.resource.DominantResourceCalculator value >
property >

 

参考:DominantResourceCalculator原理

你可能感兴趣的:(spark,yarn)