您可以将集群划分为子集群,以便作业在具有特定特征的节点上运行。您可以配置这些分区,以便在指定分区的集群节点上运行 YARN 应用程序。
注意
为了与 YARN 术语保持一致,使用术语分区而不是节点标签。
分区可以指定为exclusive
或 non-exclusive/shareable
:
· exclusive
-访问仅限于在与分区关联的队列中运行的应用程序。
· non-exclusive
-如果分区上有空闲容量可用,则资源与集群中的所有应用程序共享。
YARN 中调度的基本单位是队列。每个队列的容量指定可用于提交到队列的应用程序的集群资源的百分比。队列可以按层次结构设置,以反映利用集群资源的各种组织、组和用户所需的资源要求和访问限制。
使用分区,您可以将集群划分为子集群,以便作业可以在具有特定特征的分区上运行。例如,您可以使用分区仅在具有较大 RAM 量的节点上运行内存密集型作业。分区可以分配给集群节点,并指定为独占或非独占。然后,您可以将分区与容量调度程序队列相关联。每个节点只能与一个分区相关联。
1 分区类型
1.1 分区类型:独占
当一个队列与一个或多个独占分区相关联时,该队列提交的所有应用程序都将独占访问这些分区中的节点。
1.2 分区类型:非独占
当一个队列与一个或多个非独占分区相关联时,该队列提交的所有应用程序在这些分区中的节点上获得第一优先级。如果这些分区节点上有空闲容量可用,则资源将与集群中的其他应用程序共享。如果标记的应用程序在标记的节点上请求新资源,则未标记的应用程序被抢占。
1.3 没有关联分区的队列
如果没有为队列分配分区,则队列提交的应用程序可以在没有分区的任何节点上运行,如果有空闲资源,则可以在具有非独占分区的节点上运行。
1.4 抢占
请求标记资源的标记应用抢占标记节点上的非标记应用。如果未明确请求标记资源,则适用正常的抢占规则。未标记的应用程序不能抢占在标记节点上运行的标记应用程序。
2 在集群上启用节点标签以配置分区
您可以通过在 YARN ResourceManager 主机上进行配置更改来配置集群上的分区。
要在集群上启用分区,请在 YARN ResourceManager 主机上进行以下配置更改。
1. 在 HDFS 中创建标签目录
使用以下命令创建一个“node-labels”目录,用于在 HDFS 中存储节点标签。
//
sudo su hdfs hadoop fs -mkdir -p /yarn/node-labels hadoop fs -chown -R yarn:yarn /yarn hadoop fs -chmod -R 700 /yarn
-chmod -R 700
指定只有 YARN 用户可以访问 node-labels目录。
然后您可以使用以下命令确认该目录是在 HDFS 中创建的。
hadoop fs -ls /yarn
新 节点标签目录应出现在以下命令返回的列表中。所有者应该是yarn
,并且许可应该是 drwx
。
找到 1 个项目
drwx------ - yarnyarn 0 2014-11-24 13:09 /yarn/node-labels
使用以下命令创建/user/<user_name>
分布式 shell 所需的目录。
/
hadoop fs -mkdir -p /user/<user_name> hadoop fs -chown -R yarn:yarn /user/<user_name> hadoop fs -chmod -R 700 /user/<user_name>
2. 在 Cloudera Manager 中,选择YARN服务。
3. 单击配置选项卡。
4. 搜索YARN Service Advanced Configuration。
5. 在yarn-site.xml的YARN 服务高级配置片段(安全阀)中添加以下内容:
o 设置以下属性以启用分区:
名称:yarn.node-labels.enabled
值:true
o 设置以下属性以引用 HDFS 分区目录
名称:yarn.node-labels.fs-store.root-dir
值:hdfs://:/
例如,
名称:yarn.node-labels.fs-store.root-dir
值:hdfs://node-1.example.com:8020/yarn/node-labels/
6. 启动或重新启动 YARN ResourceManager。
3 创建分区
您必须首先创建分区以将它们分配给节点并将其与队列关联。
在创建分区之前,您必须在集群上启用节点标签。有关更多信息,请参阅在集群上启用节点标签。
1. 在Cloudera Manager 中,选择Clusters > YARN Queue Manager UI服务。图形队列层次结构显示在 概览选项卡中。
2. 单击分区选项卡。
3. 单击+创建。显示创建分区 对话框。
4. 在Partition Name 中为分区添加一个名称。
5. 在Partition Type下选择Exclusive或Non-Exclusive 节点标签类型。有关独占或非独占分区类型的信息,请参阅配置分区。
6. 选择未分配节点下列出的一个或多个未分配节点,然后单击<箭头按钮将其移动到已分配节点下以将其分配给分区。您还可以使用正则表达式搜索或过滤节点。
7. 点击保存。
4 为分区分配或取消分配节点
您可以为现有分区分配或取消分配节点。
1. 在Cloudera Manager 中,选择Clusters > YARN Queue Manager UI服务。图形队列层次结构显示在 概览选项卡中。
2. 单击分区选项卡。显示分区列表。
3. 单击分区右侧的编辑图标。
4. 在“编辑分区”对话框中分配或取消分配节点。
a. 分配节点:选择未分配节点下列出的未 分配节点,然后单击<箭头按钮将其移动到已 分配节点下。
b. 取消分配节点:选择已分配节点下列出的 分配节点,然后单击>箭头按钮将其移至 未分配节点下。
5. 点击保存。
5 查看分区
您可以查看集群中可用分区的列表。对于每个分区,它会在Hosts列下列出关联节点的数量以及分区类型和容量。
1. 在 Cloudera Manager 中,选择Clusters > YARN Queue Manager UI服务。图形队列层次结构显示在 概览选项卡中。
2. 单击分区选项卡。显示现有分区的列表。
3. 或者,您可以单击“主机” 列中列出的数字以查看关联的节点。
5.1 查看节点标签分配
您可以使用以下命令查看分区信息。
· 列出集群中所有正在运行的节点: yarn node -list
例子:
/
[root@node-1 /]# yarn node -list 14/11/21 12:14:06 INFO impl.TimelineClientImpl: Timeline service address: http://node-1.example.com:8188/ws/v1/timeline/ 14/11/21 12:14:07 INFO client.RMProxy: Connecting to ResourceManager at node-1.example.com/240.0.0.10:8032 Total Nodes:3 Node-Id Node-State Node-Http-Address Number-of-Running-Containers node-3.example.com:45454 RUNNING node-3.example.com:50060 0 node-1.example.com:45454 RUNNING node-1.example.com:50060 0 node-2.example.com:45454 RUNNING node-2.example.com:50060 0
· 列出节点的状态(包括分区): yarn node -status <Node_ID>
例子:
[root@node-1 /]# yarn node -status node-1.example.com:45454 14/11/21 06:32:35 INFO impl.TimelineClientImpl: Timeline service address: http://node-1.example.com:8188/ws/v1/timeline/ 14/11/21 06:32:35 INFO client.RMProxy: Connecting to ResourceManager at node-1.example.com/240.0.0.10:8032 Node Report : Node-Id : node-1.example.com:45454 Rack : /default-rack Node-State : RUNNING Node-Http-Address : node-1.example.com:50060 Last-Health-Update : Fri 21/Nov/14 06:32:09:473PST Health-Report : Containers : 0 Memory-Used : 0MB Memory-Capacity : 1408MB CPU-Used : 0 vcores CPU-Capacity : 8 vcores Node-Labels : x
分区也显示在节点和调度程序页面上的ResourceManager UI 中。
6 将分区与队列关联
您可以使用分区在具有指定分区的集群节点上运行 YARN 应用程序。
在关联分区之前,您必须创建分区并将分区分配给集群节点。有关创建分区的更多信息,请参阅创建分区。
注意
将分区与一个或多个队列关联后,在YARN 队列管理器 UI 中,单击 下拉列表中的概览> <分区名称>,然后在切换分配模式或创建放置规则之前将容量分配给队列。
注意
为了与 YARN 术语保持一致,使用术语分区而不是节点标签。
使用队列管理器创建分区并将其分配给集群节点,将分区 ( yarn.scheduler.capacity.<queue-path>.accessible-node-labels )与队列相关联,并为指定分区配置该队列的容量。队列管理器在分区中的所有队列之间平均分配可用容量。您可以手动修改每个队列的每个分区的容量,并确保每个级别的父队列的直接子队列的每个分区的容量总和等于 100%。队列可以访问的分区(队列的可访问分区)必须与其父队列的可访问分区相同或其子集。
假设一个集群共有 8 个节点。前 3 个节点 (n1-n3) 的 partition = x,接下来的3 个节点 (n4-n6) 的 partition = y,最后 2 个节点 (n7, n8) 没有任何分区。每个节点可以运行 10 个容器。
队列层次结构如下:
假设队列“a”可以访问分区“x”和“y”,而队列“b”只能访问分区“y”。根据定义,所有队列都可以访问没有标签的节点。
在相对资源分配模式下,考虑队列的以下示例标签配置:
容量(a)= 40,容量(a,标签= x)= 100,容量(a,标签= y)= 50;容量(b)= 60,容量(b,标签= y)= 50
这意味着:
· 队列“a”可以访问没有任何标签的节点上40%的资源,标签=x节点上100%的资源,以及标签=y节点上50%的资源。
· 队列“b”可以访问没有任何标签的节点上60%的资源,以及标签=y的节点上50%的资源。
您还可以看到此配置:
容量(a) + 容量(b) = 100
capacity(a, label=x) + capacity(b, label=x) (b不能访问label=x,为0) = 100
容量(a, 标签=y) + 容量(b, 标签=y) = 100
对于同一个父队列下的子队列,每个标签的容量总和应该等于 100%。
同样,您可以设置子队列 a1、a2 和 b1 的容量:
a1和a2:容量(a.a1)=40,容量(a.a1,标签=x)=30,容量(a.a1,标签=y)=50容量(a.a2)=60,容量(a .a2,标签=x)=70,容量(a.a2,标签=y)=50;
b1:容量(b.b1)= 100,容量(b.b1,标签=y)= 100
您可以看到 a1 和 a2 配置:
容量(a.a1) + 容量(a.a2) = 100
容量(a.a1, 标签=x) + 容量(a.a2, 标签=x) = 100
容量(a.a1, 标签=y) + 容量(a.a2, 标签=y) = 100
a1 可以排队访问多少资源?
没有标签的节点上的资源:Resource = 20(可以在没有标签的节点上分配的容器总数,在本例中为n7、n8)* 40%(a.capacity)* 40%(a.a1.capacity)= 3.2 (容器)
标签=x 的节点上的资源
资源 = 30(可以在标签=x 的节点上分配的容器总数,在本例中为 n1-n3)* 100%(a.labelx.capacity)* 30% = 9(容器)
要实现此示例配置,请执行以下操作
1. 在 Cloudera Manager 中,选择集群> YARN 队列管理器 UI 服务。图形队列层次结构显示在概览选项卡中。
2. 点击三个垂直圆点上一个队列,并选择查看/编辑队列属性选项。
3. 在队列属性对话框,对话框中,选择X从标签 残疾人专用分区下拉框中,单击+,再次选择Ÿ标签从残疾人专用分区下拉boxand点击保存。
4. 重复上述步骤为a1和a2队列分配x标签 。
5. 单击b queue上的三个垂直点,然后选择View/Edit Queue Properties选项。
6. 在Queue Properties对话框中,从Accessible Partitions 下拉框中选择y标签,单击+,然后单击Save。
7. 重复上述步骤,为b1、a、a1和a2队列分配y标签。
队列管理器自动在分区中的所有队列之间分配可用容量。如果要修改队列的容量,请单击概览选项卡中的 分区下拉框 ,选择标签并修改队列容量。
8. 在概览选项卡中,单击 分区下拉框并选择标签y。
9. 单击a队列上的三个垂直点,然后选择Edit Child Queues选项。
10. 输入a1为50和a2为50 的配置容量,然后单击保存。
11. 单击b队列上的三个垂直点并选择Edit Child Queues选项。
12. 输入配置的容量的B1至100,然后点击保存。
13. 单击根队列上的三个垂直点,然后选择“编辑子队列”选项。
14. 输入a为50和b为50 的配置容量,然后单击保存。
7 将分区与队列分离
您可以取消分区与队列的关联。您应该在删除队列之前解除分区的关联。在取消分区与队列的关联之前,您应该通过将其设置为零来删除该队列的分区容量。
- 在 Cloudera Manager 中,选择Clusters > YARN Queue Manager UI服务。图形队列层次结构显示在概览选项卡中。
- 单击队列上的三个垂直点,然后选择查看/编辑队列属性选项。
- 在“队列属性”对话框中的“ 可访问分区”中,单击分区名称旁边的X。
- 点击保存。
8 删除分区
在此版本中,由于已知问题,如果分区与队列关联并且队列具有为该分区配置的容量,则不建议删除该分区。
9 提交作业时使用分区
提交作业时,您可以使用各种方法来指定分区。
· 提交作业时设置分区
提交作业时,您可以使用以下方法指定分区:
o ApplicationSubmissionContext.setNodeLabelExpression(<node_label_expression>)
- 为应用程序的所有容器设置分区表达式。
o ResourceRequest.setNodeLabelExpression(<node_label_expression>)
- 为单个资源请求设置分区表达式。这将覆盖中设置的分区表达式 ApplicationSubmissionContext.setNodeLabelExpression(<node_label_expression>)
。
o 指定 setAMContainerResourceRequest.setNodeLabelExpression
inApplicationSubmissionContext
以指示 ApplicationMaster 容器的预期分区。
-queue
当您使用分布式 shell 客户端提交 YARN 作业时,您可以使用这些方法之一来指定分区表达式和 指定队列。如果队列具有满足标签表达式的标签,它将在分区上运行作业。如果标签表达式未引用与指定队列关联的标签,则作业不会运行并返回错误。如果未指定 partitionn,则作业仅在没有分区的节点上运行,如果空闲资源可用,则在具有非独占分区的节点上运行。
注意
您只能在.setNodeLabelExpression
方法中指定一个分区 。
例如,以下命令运行一个简单的 YARN 分布式 shell“长时间睡眠”作业。在此示例中,您要求的容器数量超过集群可以运行的数量,以便您可以查看作业在哪个节点上运行。我们指定作业应该在队列“a1”上运行,我们的用户有权在该队列上运行作业。我们还使用-node_label_expression
参数来指定作业将在标签为“x”的所有节点上运行。
sudo su yarn hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-yarn/hadoop-yarn-applications-distributedshell.jar -shell_command "sleep 100" -jar /opt/cloudera/parcels/CDH/lib/hadoop-yarn/hadoop-yarn-applications-distributedshell.jar -num_containers 30 -queue a1 -node_label_expression x
如果您在我们之前配置的示例集群上运行此作业,则会在节点 1 上分配容器,因为该节点已分配分区“x”,并且队列“a1”也具有分区“x”:
以下命令运行您为分区“x”指定的相同作业,但这次您将指定队列“b1”而不是队列“a1”。
sudo su yarn hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-yarn/hadoop-yarn-applications-distributedshell.jar -shell_command "sleep 100000" -jar /opt/cloudera/parcels/CDH/lib/hadoop-yarn/hadoop-yarn-applications-distributedshell.jar -num_containers 30 -queue b1 -node_label_expression x
当您尝试在我们的示例集群上运行此作业时,该作业将失败并显示以下错误消息,因为标签“x”与队列“b1”无关。
14/11/24 13:42:21 INFO distributedshell.Client: Submitting application to ASM 14/11/24 13:42:21 FATAL distributedshell.Client: Error running Client org.apache.hadoop.yarn.exceptions.InvalidResourceRequestException: Invalid resource request, queue=b1 doesn't have permission to access all labels in resource request. labelExpression of resource request=x. Queue labels=y
· MapReduce 作业和分区
当前,您无法在提交 MapReduce 作业时指定分区。但是,如果您将 MapReduce 作业提交到具有默认分区表达式的队列,则默认分区将应用于 MapReduce 作业。
使用默认分区表达式往往会限制集群的较大部分,这在某些时候开始对作业(例如 MapReduce 作业)产生反作用,这些作业受益于分布式并行处理提供的优势。
10 提供对队列管理器 UI 的只读访问
您现在可以允许非管理员用户以只读模式访问 YARN 队列管理器。您可以在 Cloudera Manager 中创建具有只读角色的新用户帐户或使用具有只读角色的任何现有用户帐户来访问 YARN 队列管理器 UI。在只读访问模式下,用户可以查看所有配置,但不能对配置进行任何更改。
在 Cloudera Manager 中,单击Administration > Users & Roles。
1. 提供用户名、密码,然后从 角色下拉列表中选择只读。
2. 单击添加。
有关分配用户角色的更多信息,请参阅 Cloudera Manager 用户角色。
3. 在左侧导航窗格中单击您的用户名,然后选择Sign Out。
4. 以新创建的只读用户身份登录 Cloudera Manager。
5. 单击集群 > YARN 队列管理器 UI服务。该YARN队列管理器UI显示不带编辑选项。