您好我们最近从mr1升级为纱线。我知道容器是一个抽象的概念,但我不知道一个容器可以产生多少jvm任务(映射,缩小,过滤等),或者其他方式要求是容器可以在多个映射或减少任务中重用。我在以下博客中读到:What is a container in YARN?
"each mapper and reducer runs on its own container to be accurate!"
这意味着如果我查看AM日志,我应该看到分配的容器数等于map任务的数量(失败|成功)加上reduce任务的数量是正确的吗?
我知道应用程序生命周期中容器的数量会根据AM请求,拆分,调度程序等而发生变化。
但是有没有办法为给定的应用程序请求最小容器的初始数量。我认为一种方法是配置公平调度程序队列。但还有什么能够决定这个吗?
如果我有MR mapreduce.map.memory.mb = 3gb
和
mapreduce.map.cpu.vcores=4
。我还有yarn.scheduler.minimum-allocation-mb = 1024m
和yarn.scheduler.minimum-allocation-vcores = 1
。
这是否意味着我将获得一个带有4个核心的容器或带有一个核心的4个容器?
还不清楚在哪里可以指定mapreduce.map.memory.mb
和mapreduce.map.cpu.vcores
。它们应该设置在客户机节点中还是可以按应用程序设置?
同样来自RM UI或AM UI是否有办法查看当前为给定应用程序分配的容器?
答案 0 :(得分:10)
例如我有一个Mapreduce应用程序,它产生了10个映射器:
我在具有8个vCore的单个主机上运行此命令(此值由配置参数确定: 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。
因此,对于每个map / reduce任务,都会启动另一个容器。
但是,在Yarn中,对于MapReduce作业,有一个Uber作业的概念,它允许用户使用单个容器用于多个映射器和1个reducer(https://hadoop.apache.org/docs/r2.4.1/hadoop-yarn/hadoop-yarn-common/yarn-default.xml:当前代码不能支持超过一次减少并忽略更大的价值。)。
没有可用的配置参数来指定最小容器数。 Application Master负责请求所需的容器数量。
yarn.scheduler.minimum-allocation-mb - 确定每个容器的最小内存分配( yarn.scheduler.maximum-allocation-mb 确定每个容器请求的最大分配)
yarn.scheduler.minimum-allocation-vcores - 确定每个容器的vCores的最小分配( yarn.scheduler.maximum-allocation-vcores 确定最大分配对于每个容器请求)
在您的情况下,您要求" mapreduce.map.memory.mb = 3m (3MB)和 mapreduce.map.cpu.vcores = 4 (4 vCores)。
因此,每个映射器将获得1个包含4个vCore的容器(假设 yarn.scheduler.maximum-allocation-vcores >> = 4)
参数" mapreduce.map.memory.mb" 和" mapreduce.map.cpu.vcores" 在mapred-site.xml文件中设置。如果此配置参数不是" final",则可以在提交作业之前在客户端中覆盖它。
是。来自"应用程序尝试"在该应用程序的页面中,您可以看到已分配容器的数量。请查看上图。