如何基于mapreduce2中的vCore和内存创建容器?

aiazj4mn  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(715)

我有一个由1个主节点(namenode,secondarynamenode,resourcemanager)和2个从节点(datanode,nodemanager)组成的小集群。
我在master的yarn-site.xml中设置了: yarn.scheduler.minimum-allocation-mb : 512 yarn.scheduler.maximum-allocation-mb : 1024 yarn.scheduler.minimum-allocation-vcores : 1 yarn.scheduler.maximum-allocation-vcores : 2
我已在从机的yarn-site.xml中设置: yarn.nodemanager.resource.memory-mb : 2048 yarn.nodemanager.resource.cpu-vcores : 4
然后在master中,我在mapred-site.xml中设置: mapreduce.map.memory.mb : 512 mapreduce.map.java.opts :-xmx500米 mapreduce.map.cpu.vcores : 1 mapreduce.reduce.memory.mb : 512 mapreduce.reduce.java.opts :-xmx500米 mapreduce.reduce.cpu.vcores : 1
因此,据我所知,在运行作业时,mapreduce应用程序管理员将尝试在两个从属服务器上创建多达512 mb和1个vcore的容器,每个从属服务器上只有2048 mb和4个vcore可用,这为每个从属服务器上的4个容器提供了空间。这正是我工作中发生的事情,所以到目前为止没有问题。
但是,当我增加 mapreduce.map.cpu.vcores 以及 mapreduce.reduce.cpu.vcores 从1到2,理论上应该只有足够的vCore可用于为每个从属服务器创建2个容器,对吗?但没有,我仍然有4个集装箱每个奴隶。
然后我试着增加 mapreduce.map.memory.mb 以及 mapreduce.reduce.memory.mb 从512到768。这就为2个容器留出了空间(2048/768=2)。
无论Map器和还原器的vcore设置为1还是2,这都将始终为每个从设备生成2个768mb的容器和4个512mb的容器。那么vCore是用来做什么的呢?应用程序管理员似乎并不在意。
另外,当将内存设置为768,将vcores设置为2时,Map器容器的nodemanager ui上会显示以下信息:

768 mb变为1024 totalmemoryneeded,2个vCore被忽略并显示为1 totalvcoresneeded。
因此,要将“它是如何工作的”问题分解为多个问题:
是否只使用内存(忽略vcores)来计算容器的数量?
mapreduce.map.memory.mb 值仅仅是一个用于计算容器数量的完全抽象的值(这就是为什么它可以四舍五入到下一个2的幂)?或者它在某种程度上代表了真实的内存分配?
为什么要在中指定一些-xmx值 mapreduce.map.java.opts ? 为什么Yarn不使用 mapreduce.map.memory.mb 为容器分配内存?
totalvcoresneed是多少?为什么它总是等于1?我试着改变 mapreduce.map.cpu.vcores 在所有节点(主节点和从节点)中,但它从不更改。

yi0zb3m4

yi0zb3m41#

我将回答这个问题,假设使用的调度程序是capacityscheduler。
capacityscheduler使用resourcecalculator计算应用程序所需的资源。有两种类型的资源计算器:
defaultresourcecalculator:只考虑用于进行资源计算的内存(即用于计算容器数)
主要资源计算器:考虑内存和cpu的资源计算
默认情况下,capacityscheduler使用defaultresourcecalculator。如果要使用dominantresourcecalculator,则需要在“capacity scheduler.xml”文件中设置以下属性:

  1. <property>
  2. <name>yarn.scheduler.capacity.resource-calculator</name>
  3. <value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>
  4. </property>

现在,回答你的问题:
如果使用dominantresourcecalculator,则在计算容器数时会同时考虑内存和vCore
mapreduce.map.memory.mb不是抽象值。在计算资源时会考虑到这一点。
dominanceResourceCalculator类有一个normalize()函数,它使用minimumResource(由config yarn.scheduler.minimum allocation mb确定)、maximumresource(由config yarn.scheduler.maximum allocation mb确定)和步长因子(由config yarn.scheduler.minimum allocation mb确定)来规范化资源请求。
规范化内存的代码如下所示(请检查org.apache.hadoop.yarn.util.resource.dominantresourcecalculator.java):

  1. int normalizedMemory = Math.min(roundUp(
  2. Math.max(r.getMemory(), minimumResource.getMemory()),
  3. stepFactor.getMemory()),maximumResource.getMemory());

哪里:
r=请求的内存
逻辑如下:
答。取最大值(请求的资源和最小资源)=最大值(768,512)=768
b。舍入(768,阶跃因子)=舍入(768,512)==1279(近似值)

  1. Roundup does : ((768 + (512 -1)) / 512) * 512

c。最小值(取整(512,阶跃因子),最大资源)=最小值(1279,1024)=1024
最后,分配的内存是1024MB,这就是您得到的。
为了简单起见,您可以说roundup以512MB的步长增加了需求(这是一个最小的资源)
由于Map器是一个java进程,因此mapreduce.map.java.opts用于指定Map器的堆大小。
其中as mapreduce.map.memory.mb是容器使用的总内存。
mapreduce.map.java.opts的值应小于mapreduce.map.memory.mb
这里的答案解释了:apachehadoop中的“mapreduce.map.memory.mb”和“mapred.map.child.java.opts”之间的关系是什么?
当您使用dominantresourcecalculator时,它使用normalize()函数来计算所需的vcores。
其代码是(类似于内存的标准化):

  1. int normalizedCores = Math.min(roundUp
  2. ` Math.max(r.getVirtualCores(), minimumResource.getVirtualCores()),
  3. stepFactor.getVirtualCores()), maximumResource.getVirtualCores());
展开查看全部

相关问题