我有一个由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
在所有节点(主节点和从节点)中,但它从不更改。
1条答案
按热度按时间yi0zb3m41#
我将回答这个问题,假设使用的调度程序是capacityscheduler。
capacityscheduler使用resourcecalculator计算应用程序所需的资源。有两种类型的资源计算器:
defaultresourcecalculator:只考虑用于进行资源计算的内存(即用于计算容器数)
主要资源计算器:考虑内存和cpu的资源计算
默认情况下,capacityscheduler使用defaultresourcecalculator。如果要使用dominantresourcecalculator,则需要在“capacity scheduler.xml”文件中设置以下属性:
现在,回答你的问题:
如果使用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):
哪里:
r=请求的内存
逻辑如下:
答。取最大值(请求的资源和最小资源)=最大值(768,512)=768
b。舍入(768,阶跃因子)=舍入(768,512)==1279(近似值)
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。
其代码是(类似于内存的标准化):