Yarn容器的理解和调优

10

你好,我们最近从mr1升级到了yarn。我知道容器是一个抽象的概念,但我不明白一个容器可以生成多少个jvm任务(map、reduce、filter等),或者说容器是否可以在多个map或reduce任务之间重复使用。我在以下博客中阅读到:What is a container in YARN?

"每个mapper和reducer都在自己的容器上运行以保持准确性!" 这意味着如果我查看AM日志,我应该看到分配的容器数量等于map任务(失败|成功)的数量加上reduce任务的数量,这正确吗?

我知道容器的数量会随着应用程序生命周期的变化而改变,基于AM请求、拆分、调度器等。

但有没有一种方法可以为给定的应用程序请求初始的最小容器数量。我认为一种方法是配置公平调度程序队列。但还有其他可以指定它的方法吗?

在MR的情况下,如果我有 mapreduce.map.memory.mb = 3gbmapreduce.map.cpu.vcores=4。我还有 yarn.scheduler.minimum-allocation-mb = 1024myarn.scheduler.minimum-allocation-vcores = 1

这是否意味着我将获得一个具有4个核心的容器,或者是4个具有一个核心的容器?

此外,不清楚在哪里可以指定 mapreduce.map.memory.mbmapreduce.map.cpu.vcores。它们应该在客户端节点上设置还是也可以每个应用程序设置?

另外,从RM UI或AM UI中是否有一种方法可以查看分配给给定应用程序的当前容器?

1个回答

12
  1. 容器是一个逻辑实体,它允许应用程序在特定的主机(节点管理器)上使用特定数量的资源(内存、CPU等)。一个容器不能在同一个应用程序的映射和减少任务之间被重复使用。

例如,我有一个Mapreduce应用程序,它生成10个映射器: Number of mappers

我在一台拥有8个虚拟内核的单个主机上运行此应用程序(此值由配置参数yarn.nodemanager.resource.cpu-vcores确定)。默认情况下,此值设置为8。请查看“YarnConfiguration.java”。

  /** Number of Virtual CPU Cores which can be allocated for containers.*/
  public static final String NM_VCORES = NM_PREFIX + "resource.cpu-vcores";
  public static final int DEFAULT_NM_VCORES = 8;

由于有10个映射器和1个应用程序主节点,产生的容器总数为11。 enter image description here 因此,对于每个map/reduce任务,都会启动不同的容器。
但是,在Yarn中,对于MapReduce作业,存在Uber job的概念,该概念使用户能够使用单个容器来处理多个映射器和1个减少器( https://hadoop.apache.org/docs/r2.4.1/hadoop-yarn/hadoop-yarn-common/yarn-default.xml:目前代码不能支持多个reduce并且将忽略较大的值)。
  1. 没有可用的配置参数来指定容器的最小数量。请求所需容器数量是应用程序主节点的责任。

  2. yarn.scheduler.minimum-allocation-mb - 确定每个容器的最小内存分配量(yarn.scheduler.maximum-allocation-mb 确定每个容器请求的最大分配量)

    yarn.scheduler.minimum-allocation-vcores - 确定每个容器的最小vCore分配量(yarn.scheduler.maximum-allocation-vcores 确定每个容器请求的最大分配量)

    在您的情况下,您正在请求 "mapreduce.map.memory.mb = 3m (3MB) 和 mapreduce.map.cpu.vcores = 4 (4 vCores)。

    因此,对于每个mapper,您将获得具有4个vCores的1个容器(假设yarn.scheduler.maximum-allocation-vcores >= 4)。

  3. 参数"mapreduce.map.memory.mb""mapreduce.map.cpu.vcores"设置在mapred-site.xml文件中。如果此配置参数不是"final",则可以在提交作业之前在客户端中覆盖它。

  4. 是的。从应用程序的"应用程序尝试"页面,您可以看到分配的容器数量。请查看上面附加的图。


  1. 应用程序管理器如何请求所需的容器数量。例如,在Spark yarn-client模式下,我知道它是由spark.executor.instances定义的,但这如何转化为Yarn可以理解的内容呢?简单地说,哪些Yarn属性允许应用程序管理器设置容器数量。在Hadoop AM示例中,我看到以下内容:rsrcRequest.setNumContainers(numContainers);您能确认它是通过编程方式设置的,而不是通过任何参数设置的吗?
- nir
  1. "Application Attempt"页面是一个新功能吗?我在2.5.1中没有看到它。
- nir
1
你在这里参考的是:https://hadoop.apache.org/docs/r0.23.11/hadoop-yarn/hadoop-yarn-site/WritingYarnApplications.html。这个例子讲述了如何编写一个应用程序主管(Application Master)。AM必须决定需要多少容器,然后通过资源请求调用RM。在请求资源时,它通过调用“setNumContainers”方法来请求容器。我的第二点回答意思是一样的。 - Manjunath Ballur
1
对于第5点,很抱歉,我不知道你的Hadoop版本。我正在使用Hadoop 2.7.1。从主YARN RM UI:当您单击应用程序ID时,它会带您进入应用程序页面。在应用程序页面底部,它显示所有尝试。当您单击尝试ID时,它会带您进入尝试页面。在尝试页面中,它显示每个容器的分配容器总数和日志。 - Manjunath Ballur
感谢澄清。是的,我理解了你的第二点。我只是想知道AM使用什么机制来实现这一点。 - nir
对于第二点,这篇Cloudera博客提供了一些想法:http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_ig_yarn_tuning.html。对于mapreduce作业,容器的数量将等于mapper的数量+reducer的数量。在计算出mapper的数量(例如基于分片大小)和reducer之后,AM通过调用“setNumContainer()”方法向RM请求相应数量的容器。 - Manjunath Ballur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接