YARN 支持可扩展的资源模型。默认情况下,YARN 会跟踪所有节点、应用程序和队列的 CPU 和内存,但可以扩展资源定义以包括任意“可计数”资源。可计数资源是在容器运行时消耗的资源,但在容器运行结束后会释放该资源。CPU 和内存都是可计数资源。其他示例包括 GPU 资源和软件许可证。
此外,YARN 还支持使用“资源配置文件”,它允许用户通过单个配置文件指定多个资源请求,类似于亚马逊网络服务弹性计算集群实例类型。例如,“large”可能表示 8 个虚拟内核和 16GB RAM。
支持以下配置属性。详情请见下方。
yarn-site.xml
| 配置属性 | 说明 |
|---|---|
yarn.resourcemanager.resource-profiles.enabled |
指示是否启用资源配置文件支持。默认为 false。 |
resource-types.xml
| 配置属性 | 说明 |
|---|---|
yarn.resource-types |
其他资源的逗号分隔列表。不得包括 memory、memory-mb 或 vcores |
yarn.resource-types.<resource>.units |
指定资源类型的默认单位 |
yarn.resource-types.<resource>.minimum-allocation |
指定资源类型的最小请求 |
yarn.resource-types.<resource>.maximum-allocation |
指定资源类型的最大请求 |
node-resources.xml
| 配置属性 | 说明 |
|---|---|
yarn.nodemanager.resource-type.<resource> |
节点管理器提供的指定资源的计数 |
请注意,如果使用 resource-types.xml 和 node-resources.xml 文件,则它们也需要与 yarn-site.xml 放置在同一配置目录中。或者,也可以将这些属性放入 yarn-site.xml 文件中。
资源管理器是集群中哪些资源被跟踪的最终仲裁者。资源管理器从 XML 配置文件加载其资源定义。例如,要在 CPU 和内存之外定义一个新资源,应配置以下属性
<configuration>
<property>
<name>yarn.resource-types</name>
<value>resource1,resource2</value>
<description>
The resources to be used for scheduling. Use resource-types.xml
to specify details about the individual resource types.
</description>
</property>
</configuration>
有效的资源名称必须以字母开头,且仅包含字母、数字和以下任意字符:‘.’、‘_’或‘-’。有效的资源名称还可以选择以名称空间开头,后跟斜杠。有效的名称空间由字母、数字和破折号组成的以句点分隔的组组成。例如,以下资源名称有效
以下是不正确的资源名称示例
对于定义的每种新资源类型,都可以添加一个可选的单位属性来设置资源类型的默认单位。有效值是
| 单位名称 | 含义 |
|---|---|
| p | 皮 |
| n | 纳 |
| u | 微 |
| m | 毫 |
| 默认,即无单位 | |
| k | 千 |
| M | 兆 |
| G | 吉 |
| T | 太 |
| P | 拍 |
| Ki | 二进制千,即 1024 |
| Mi | 二进制兆,即 1024^2 |
| Gi | 二进制吉,即 1024^3 |
| Ti | 二进制太,即 1024^4 |
| Pi | 二进制拍,即 1024^5 |
属性必须命名为 yarn.resource-types.<resource>.units。每个已定义资源还可以具有可选的最小值和最大值属性。这些属性必须命名为 yarn.resource-types.<resource>.minimum-allocation 和 yarn.resource-types.<resource>.maximum-allocation。
yarn.resource-types 属性以及任何单位、最小值或最大值属性都可以在通常的 yarn-site.xml 文件中定义,也可以在名为 resource-types.xml 的文件中定义。例如,以下内容可以出现在任一文件中
<configuration>
<property>
<name>yarn.resource-types</name>
<value>resource1, resource2</value>
</property>
<property>
<name>yarn.resource-types.resource1.units</name>
<value>G</value>
</property>
<property>
<name>yarn.resource-types.resource2.minimum-allocation</name>
<value>1</value>
</property>
<property>
<name>yarn.resource-types.resource2.maximum-allocation</name>
<value>1024</value>
</property>
</configuration>
每个节点管理器独立定义该节点可用的资源。通过为每个可用资源设置属性来完成资源定义。该属性必须命名为 yarn.nodemanager.resource-type.<resource>,并且可以放置在通常的 yarn-site.xml 文件中,也可以放置在名为 noderesources.xml 的文件中。该属性的值应该是该节点提供的该资源的数量。例如
<configuration> <property> <name>yarn.nodemanager.resource-type.resource1</name> <value>5G</value> </property> <property> <name>yarn.nodemanager.resource-type.resource2</name> <value>2m</value> </property> </configuration>
请注意,用于这些资源的单位不必与资源管理器持有的定义匹配。如果单位不匹配,资源管理器将自动进行转换。
MapReduce 从 YARN 请求三种不同类型的容器:应用程序主容器、映射容器和归约容器。对于每种容器类型,都有相应的一组属性,可用于设置请求的资源。
MapReduce 中用于设置资源请求的属性是
| 属性 | 说明 |
|---|---|
yarn.app.mapreduce.am.resource.mb |
将应用程序主容器请求的内存设置为 MB 中的值。不再建议使用。改为使用 yarn.app.mapreduce.am.resource.memory-mb。默认为 1536。 |
yarn.app.mapreduce.am.resource.memory |
将应用程序主容器请求的内存设置为 MB 中的值。不再建议使用。改为使用 yarn.app.mapreduce.am.resource.memory-mb。默认为 1536。 |
yarn.app.mapreduce.am.resource.memory-mb |
将应用程序主容器请求的内存设置为 MB 中的值。默认为 1536。 |
yarn.app.mapreduce.am.resource.cpu-vcores |
将应用程序主容器请求的 CPU 设置为该值。不再建议使用。改为使用 yarn.app.mapreduce.am.resource.vcores。默认为 1。 |
yarn.app.mapreduce.am.resource.vcores |
将应用程序主容器请求的 CPU 设置为该值。默认为 1。 |
yarn.app.mapreduce.am.resource.<resource> |
将应用程序主容器请求的 <resource> 数量设置为该值。如果未指定单位,则假定资源的默认单位。请参阅上面有关单位的部分。 |
mapreduce.map.memory.mb |
将所有映射任务容器请求的内存设置为 MB 中的值。不再建议使用。改为使用 mapreduce.map.resource.memory-mb。默认为 1024。 |
mapreduce.map.resource.memory |
将所有映射任务容器请求的内存设置为 MB 中的值。不再建议使用。改为使用 mapreduce.map.resource.memory-mb。默认为 1024。 |
mapreduce.map.resource.memory-mb |
将所有映射任务容器请求的内存设置为 MB 中的值。默认为 1024。 |
mapreduce.map.cpu.vcores |
将所有映射任务容器请求的 CPU 设置为该值。不再建议使用。改为使用 mapreduce.map.resource.vcores。默认为 1。 |
mapreduce.map.resource.vcores |
将所有映射任务容器请求的 CPU 设置为该值。默认为 1。 |
mapreduce.map.resource.<resource> |
将所有映射任务容器请求的 <resource> 数量设置为该值。如果未指定单位,则假定资源的默认单位。请参阅上面有关单位的部分。 |
mapreduce.reduce.memory.mb |
将所有归约任务容器请求的内存设置为 MB 中的值。不再建议使用。改为使用 mapreduce.reduce.resource.memory-mb。默认为 1024。 |
mapreduce.reduce.resource.memory |
将所有归约任务容器请求的内存设置为 MB 中的值。不再建议使用。改为使用 mapreduce.reduce.resource.memory-mb。默认为 1024。 |
mapreduce.reduce.resource.memory-mb |
将所有归约任务容器请求的内存设置为 MB 中的值。默认为 1024。 |
mapreduce.reduce.cpu.vcores |
将所有归约任务容器请求的 CPU 设置为该值。不再建议使用。改为使用 mapreduce.reduce.resource.vcores。默认为 1。 |
mapreduce.reduce.resource.vcores |
将所有 reduce 任务容器请求的 CPU 设置为该值。默认值为 1。 |
mapreduce.reduce.resource.<resource> |
将所有 reduce 任务容器请求的 <resource> 数量设置为该值。如果未指定单位,则假定资源的默认单位。请参阅上述单位部分。 |
请注意,YARN 可能会修改这些资源请求,以满足配置的最小和最大资源值,或使其成为配置的增量的倍数。请参阅 YARN 调度程序配置中的 yarn.scheduler.maximum-allocation-mb、yarn.scheduler.minimum-allocation-mb、yarn.scheduler.increment-allocation-mb、yarn.scheduler.maximum-allocation-vcores、yarn.scheduler.minimum-allocation-vcores 和 yarn.scheduler.increment-allocation-vcores 属性。
资源配置文件为用户提供了一种简单的方法,可以使用单个配置文件请求一组资源,并为管理员提供了一种方法来调节资源的消耗方式。
要配置资源类型,管理员必须在资源管理器 yarn-site.xml 文件中将 yarn.resourcemanager.resource-profiles.enabled 设置为 true。此文件定义受支持的配置文件。例如
{
"small": {
"memory-mb" : 1024,
"vcores" : 1
},
"default" : {
"memory-mb" : 2048,
"vcores" : 2
},
"large" : {
"memory-mb": 4096,
"vcores" : 4
},
"compute" : {
"memory-mb" : 2048,
"vcores" : 2,
"gpu" : 1
}
}
在此示例中,用户可以访问具有不同资源设置的四个配置文件。请注意,在 compute 配置文件中,管理员已配置了如上所述的附加资源。
分布式 shell 目前是唯一支持资源配置文件的客户端。使用分布式 shell,用户可以指定一个资源配置文件名称,该名称将自动转换为一组适当的资源请求。
例如
hadoop job $DISTSHELL -jar $DISTSHELL -shell_command run.sh -container_resource_profile small