gpt4 book ai didi

hadoop - MapReduce2 中如何基于 vcores 和内存创建容器?

转载 作者:可可西里 更新时间:2023-11-01 14:11:57 26 4
gpt4 key购买 nike

我有一个由 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

我在slaves的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 : -Xmx500m
  • mapreduce.map.cpu.vcores:1
  • mapreduce.reduce.memory.mb:512
  • mapreduce.reduce.java.opts : -Xmx500m
  • mapreduce.reduce.cpu.vcores:1

因此据我了解,在运行作业时,mapreduce ApplicationMaster 将尝试在两个从站上创建尽可能多的 512 Mb 和 1 个 vCore 容器,每个从站只有 2048 Mb 和 4 个 vCores 可用,这为 4 个提供了空间每个奴隶上的容器。这正是我工作中发生的情况,所以到目前为止没有问题。

但是,当我将 mapreduce.map.cpu.vcoresmapreduce.reduce.cpu.vcores 从 1 增加到 2 时,理论上应该只有足够的 vCores可用于为每个奴隶创建 2 个容器吗?但是不,我每个奴隶还有 4 个容器。

然后我尝试将 mapreduce.map.memory.mbmapreduce.reduce.memory.mb 从 512 增加到 768。这为 2 个容器留出了空间( 2048/768=2)。

映射器和缩减器的 vCore 设置为 1 或 2 无关紧要,这始终会为每个从站生成 2 个 768mb 容器和 4 个 512mb 容器。那么 vCore 有什么用? ApplicationMaster 似乎并不关心。

此外,当将内存设置为 768 并将 vCores 设置为 2 时,我在映射器容器的节点管理器 UI 上显示了此信息:

nodemanager UI screenshot

768 Mb 变成了 1024 TotalMemoryNeeded,2 个 vCores 被忽略并显示为 1 TotalVCoresNeeded。

因此,将“它是如何工作的”问题分解为多个问题:

  1. 是否仅使用内存(忽略 vCore)来计算容器数量?
  2. mapreduce.map.memory.mb 值是否只是一个用于计算容器数量的完全抽象值(这就是为什么它可以四舍五入到 2 的下一次幂)?或者它是否以某种方式代表真实的内存分配?
  3. 为什么我们在 mapreduce.map.java.opts 中指定一些 -Xmx 值?为什么 yarn 不使用 mapreduce.map.memory.mb 中的值来为容器分配内存?
  4. 什么是 TotalVCoresNeeded,为什么它总是等于 1?我尝试更改所有节点(主节点和从节点)中的 mapreduce.map.cpu.vcores 但它从未更改。

最佳答案

我将假设所使用的调度程序是 CapacityScheduler 来回答这个问题。

CapacityScheduler 使用 ResourceCalculator 计算应用程序所需的资源。有两种类型的资源计算器:

  1. DefaultResourceCalculator:考虑到,只有内存用于资源计算(即用于计算容器数量)
  2. DominantResourceCalculator:考虑到资源计算的内存和 CPU

默认情况下,CapacityScheduler 使用DefaultResourceCalculator。如果你想使用DominantResourceCalculator,那么你需要在“capacity-scheduler.xml”文件中设置以下属性:

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

现在,回答您的问题:

  1. 如果使用DominantResourceCalculator,则在计算容器数量时同时考虑内存和VCores

  2. ma​​preduce.map.memory.mb 不是抽象值。在计算资源时将其考虑在内。

    DominantResourceCalculator 类有一个 normalize() 函数,它使用 minimumResouce(由配置 yarn.scheduler.minimum-allocation-mb 确定)规范化资源请求,最大资源(由配置 yarn.scheduler.maximum-allocation-mb 决定)和步长因子(由配置 yarn.scheduler.minimum-allocation-mb 决定)。

    标准化内存的代码如下所示(检查 org.apache.hadoop.yarn.util.resource.DominantResourceCalculator.java):

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

地点:

r = 请求的内存

逻辑如下:

一个。取max of(requested resource and minimum resource) = max(768, 512) = 768

roundup(768, StepFactor) = roundUp (768, 512) == 1279(大约)

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

min(roundup(512, stepFactor), maximumresource) = min(1279, 1024) = 1024

最后,分配的内存为 1024 MB,这就是您得到的。

为了简单起见,您可以说汇总,以 512 MB(这是最小资源)的步长增加需求

  1. 由于 Mapper 是一个 java 进程,ma​​preduce.map.java.opts 用于指定映射器的堆大小。

ma​​preduce.map.memory.mb 是容器使用的总内存。

ma​​preduce.map.java.opts 的值应小于 ma​​preduce.map.memory.mb

这里的答案解释说:What is the relation between 'mapreduce.map.memory.mb' and 'mapred.map.child.java.opts' in Apache Hadoop YARN?

  1. 当您使用 DominantResourceCalculator 时,它会使用 normalize() 函数来计算所需的 vCore。

    它的代码是(类似于内存的规范化):

      int normalizedCores = Math.min(roundUp  
    ` Math.max(r.getVirtualCores(), minimumResource.getVirtualCores()),
    stepFactor.getVirtualCores()), maximumResource.getVirtualCores());

关于hadoop - MapReduce2 中如何基于 vcores 和内存创建容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33099601/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com