指定 YARN 节点标签时 YARN 应用程序无法启动
YARN applications cannot start when specifying YARN node labels
我正在尝试使用 YARN node labels 来标记工作节点,但是当我在 YARN(Spark 或简单的 YARN 应用程序)上 运行 应用程序时,这些应用程序无法启动。
使用 Spark,当指定 --conf spark.yarn.am.nodeLabelExpression="my-label"
时,作业无法启动(在 Submitted application [...]
上被阻止,请参阅下面的详细信息)。
使用 YARN 应用程序(如 distributedshell
),当指定 -node_label_expression my-label
时,应用程序无法启动
这是我到目前为止所做的测试。
YARN 节点标签设置
我正在使用 Google Dataproc to run my cluster (example : 4 workers, 2 on preemptible nodes)。我的目标是强制任何 YARN 应用程序主机在 非抢占节点 上 运行,否则该节点可以随时关闭,从而使应用程序严重失败。
我正在使用 YARN 属性 (--properties
) 创建集群以启用节点标签:
gcloud dataproc clusters create \
my-dataproc-cluster \
--project [PROJECT_ID] \
--zone [ZONE] \
--master-machine-type n1-standard-1 \
--master-boot-disk-size 10 \
--num-workers 2 \
--worker-machine-type n1-standard-1 \
--worker-boot-disk-size 10 \
--num-preemptible-workers 2 \
--properties 'yarn:yarn.node-labels.enabled=true,yarn:yarn.node-labels.fs-store.root-dir=/system/yarn/node-labels'
打包的 Hadoop 和 Spark 版本:
- Hadoop 版本:2.8.2
- Spark 版本:2.2.0
之后,我创建了一个标签 (my-label
),并用这个标签更新了两个不可抢占的 worker :
yarn rmadmin -addToClusterNodeLabels "my-label(exclusive=false)"
yarn rmadmin -replaceLabelsOnNode "\
[WORKER_0_NAME].c.[PROJECT_ID].internal=my-label \
[WORKER_1_NAME].c.[PROJECT_ID].internal=my-label"
我可以在 YARN Web 中看到创建的标签 UI :
火花
当我 运行 一个简单的例子 (SparkPi
) 没有指定关于节点标签的信息时:
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
/usr/lib/spark/examples/jars/spark-examples.jar \
10
在 YARN Web UI 的“调度程序”选项卡中,我看到应用程序在 <DEFAULT_PARTITION>.root.default
上启动。
但是当我 运行 作业指定 spark.yarn.am.nodeLabelExpression
来设置 Spark 应用程序主机的位置时:
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
--conf spark.yarn.am.nodeLabelExpression="my-label" \
/usr/lib/spark/examples/jars/spark-examples.jar \
10
作业未启动。从 YARN Web UI,我看到:
- YarnApplicationState:
ACCEPTED: waiting for AM container to be allocated, launched and register with RM.
- 诊断:
Application is Activated, waiting for resources to be assigned for AM. Details : AM Partition = my-label ; Partition Resource = <memory:6144, vCores:2> ; Queue's Absolute capacity = 0.0 % ; Queue's Absolute used capacity = 0.0 % ; Queue's Absolute max capacity = 0.0 % ;
我怀疑与标签分区相关的队列(不是 <DEFAULT_PARTITION
,另一个)没有足够的资源来 运行 作业:
这里,Used Application Master Resources
是<memory:1024, vCores:1>
,但是Max Application Master Resources
是<memory:0, vCores:0>
。这解释了应用程序无法启动的原因,但我不知道如何更改它。
我尝试更新不同的参数,但没有成功:
yarn.scheduler.capacity.root.default.accessible-node-labels=my-label
或增加这些属性:
yarn.scheduler.capacity.root.default.accessible-node-labels.my-label.capacity
yarn.scheduler.capacity.root.default.accessible-node-labels.my-label.maximum-capacity
yarn.scheduler.capacity.root.default.accessible-node-labels.my-label.maximum-am-resource-percent
yarn.scheduler.capacity.root.default.accessible-node-labels.my-label.user-limit-factor
yarn.scheduler.capacity.root.default.accessible-node-labels.my-label.minimum-user-limit-percent
都没有成功。
YARN 应用程序
运行使用 YARN 应用程序时问题相同:
hadoop jar \
/usr/lib/hadoop-yarn/hadoop-yarn-applications-distributedshell.jar \
-shell_command "echo ok" \
-jar /usr/lib/hadoop-yarn/hadoop-yarn-applications-distributedshell.jar \
-queue default \
-node_label_expression my-label
应用程序无法启动,日志不断重复:
INFO distributedshell.Client: Got application report from ASM for, appId=6, clientToAMToken=null, appDiagnostics= Application is Activated, waiting for resources to be assigned for AM. Details : AM Partition = my-label ; Partition Resource = <memory:6144, vCores:2> ; Queue's Absolute capacity = 0.0 % ; Queue's Absolute used capacity = 0.0 % ; Queue's Absolute max capacity = 0.0 % ; , appMasterHost=N/A, appQueue=default, appMasterRpcPort=-1, appStartTime=1520354045946, yarnAppState=ACCEPTED, distributedFinalState=UNDEFINED, [...]
如果我没有指定 -node_label_expression my-label
,应用程序在 <DEFAULT_PARTITION>.root.default
开始并成功。
问题
- 我是不是对标签做错了什么?但是,我遵循了 official documentation and this guide
- 这是与 Dataproc 相关的特定问题吗?因为以前的指南似乎适用于其他环境
- 也许我需要创建一个特定的队列并将其与我的标签相关联?但是因为我运行宁 "one-shot" 集群到 运行 一个单一的 Spark 作业我不需要有特定的队列,运行宁默认根上的作业对我的用例来说不是问题
感谢您的帮助
一位Google工程师回答了我们(在我们提出的私人问题上,而不是在PIT中),并通过指定初始化脚本来创建Dataproc集群给了我们一个解决方案。我不认为问题来自 Dataproc,这基本上只是 YARN 配置。在创建节点标签 (my-label
) 之后,脚本在 capacity-scheduler.xml
中设置以下属性:
<property>
<name>yarn.scheduler.capacity.root.accessible-node-labels</name>
<value>my-label</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.accessible-node-labels.my-label.capacity</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.accessible-node-labels</name>
<value>my-label</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.accessible-node-labels.my-label.capacity</name>
<value>100</value>
</property>
根据脚本附带的评论,"set accessible-node-labels
on both root
(the root queue) and root.default
(the default queue applications actually get run on)"。 root.default
部分是我测试中缺少的部分。两者的容量都设置为 100。
然后,需要重新启动 YARN (systemctl restart hadoop-yarn-resourcemanager.service
) 以验证修改。
在那之后,我能够开始在我的问题中未能完成的工作。
希望对遇到相同或类似问题的人有所帮助。
我正在尝试使用 YARN node labels 来标记工作节点,但是当我在 YARN(Spark 或简单的 YARN 应用程序)上 运行 应用程序时,这些应用程序无法启动。
使用 Spark,当指定
--conf spark.yarn.am.nodeLabelExpression="my-label"
时,作业无法启动(在Submitted application [...]
上被阻止,请参阅下面的详细信息)。使用 YARN 应用程序(如
distributedshell
),当指定-node_label_expression my-label
时,应用程序无法启动
这是我到目前为止所做的测试。
YARN 节点标签设置
我正在使用 Google Dataproc to run my cluster (example : 4 workers, 2 on preemptible nodes)。我的目标是强制任何 YARN 应用程序主机在 非抢占节点 上 运行,否则该节点可以随时关闭,从而使应用程序严重失败。
我正在使用 YARN 属性 (--properties
) 创建集群以启用节点标签:
gcloud dataproc clusters create \
my-dataproc-cluster \
--project [PROJECT_ID] \
--zone [ZONE] \
--master-machine-type n1-standard-1 \
--master-boot-disk-size 10 \
--num-workers 2 \
--worker-machine-type n1-standard-1 \
--worker-boot-disk-size 10 \
--num-preemptible-workers 2 \
--properties 'yarn:yarn.node-labels.enabled=true,yarn:yarn.node-labels.fs-store.root-dir=/system/yarn/node-labels'
打包的 Hadoop 和 Spark 版本:
- Hadoop 版本:2.8.2
- Spark 版本:2.2.0
之后,我创建了一个标签 (my-label
),并用这个标签更新了两个不可抢占的 worker :
yarn rmadmin -addToClusterNodeLabels "my-label(exclusive=false)"
yarn rmadmin -replaceLabelsOnNode "\
[WORKER_0_NAME].c.[PROJECT_ID].internal=my-label \
[WORKER_1_NAME].c.[PROJECT_ID].internal=my-label"
我可以在 YARN Web 中看到创建的标签 UI :
火花
当我 运行 一个简单的例子 (SparkPi
) 没有指定关于节点标签的信息时:
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
/usr/lib/spark/examples/jars/spark-examples.jar \
10
在 YARN Web UI 的“调度程序”选项卡中,我看到应用程序在 <DEFAULT_PARTITION>.root.default
上启动。
但是当我 运行 作业指定 spark.yarn.am.nodeLabelExpression
来设置 Spark 应用程序主机的位置时:
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
--conf spark.yarn.am.nodeLabelExpression="my-label" \
/usr/lib/spark/examples/jars/spark-examples.jar \
10
作业未启动。从 YARN Web UI,我看到:
- YarnApplicationState:
ACCEPTED: waiting for AM container to be allocated, launched and register with RM.
- 诊断:
Application is Activated, waiting for resources to be assigned for AM. Details : AM Partition = my-label ; Partition Resource = <memory:6144, vCores:2> ; Queue's Absolute capacity = 0.0 % ; Queue's Absolute used capacity = 0.0 % ; Queue's Absolute max capacity = 0.0 % ;
我怀疑与标签分区相关的队列(不是 <DEFAULT_PARTITION
,另一个)没有足够的资源来 运行 作业:
这里,Used Application Master Resources
是<memory:1024, vCores:1>
,但是Max Application Master Resources
是<memory:0, vCores:0>
。这解释了应用程序无法启动的原因,但我不知道如何更改它。
我尝试更新不同的参数,但没有成功:
yarn.scheduler.capacity.root.default.accessible-node-labels=my-label
或增加这些属性:
yarn.scheduler.capacity.root.default.accessible-node-labels.my-label.capacity
yarn.scheduler.capacity.root.default.accessible-node-labels.my-label.maximum-capacity
yarn.scheduler.capacity.root.default.accessible-node-labels.my-label.maximum-am-resource-percent
yarn.scheduler.capacity.root.default.accessible-node-labels.my-label.user-limit-factor
yarn.scheduler.capacity.root.default.accessible-node-labels.my-label.minimum-user-limit-percent
都没有成功。
YARN 应用程序
运行使用 YARN 应用程序时问题相同:
hadoop jar \
/usr/lib/hadoop-yarn/hadoop-yarn-applications-distributedshell.jar \
-shell_command "echo ok" \
-jar /usr/lib/hadoop-yarn/hadoop-yarn-applications-distributedshell.jar \
-queue default \
-node_label_expression my-label
应用程序无法启动,日志不断重复:
INFO distributedshell.Client: Got application report from ASM for, appId=6, clientToAMToken=null, appDiagnostics= Application is Activated, waiting for resources to be assigned for AM. Details : AM Partition = my-label ; Partition Resource = <memory:6144, vCores:2> ; Queue's Absolute capacity = 0.0 % ; Queue's Absolute used capacity = 0.0 % ; Queue's Absolute max capacity = 0.0 % ; , appMasterHost=N/A, appQueue=default, appMasterRpcPort=-1, appStartTime=1520354045946, yarnAppState=ACCEPTED, distributedFinalState=UNDEFINED, [...]
如果我没有指定 -node_label_expression my-label
,应用程序在 <DEFAULT_PARTITION>.root.default
开始并成功。
问题
- 我是不是对标签做错了什么?但是,我遵循了 official documentation and this guide
- 这是与 Dataproc 相关的特定问题吗?因为以前的指南似乎适用于其他环境
- 也许我需要创建一个特定的队列并将其与我的标签相关联?但是因为我运行宁 "one-shot" 集群到 运行 一个单一的 Spark 作业我不需要有特定的队列,运行宁默认根上的作业对我的用例来说不是问题
感谢您的帮助
一位Google工程师回答了我们(在我们提出的私人问题上,而不是在PIT中),并通过指定初始化脚本来创建Dataproc集群给了我们一个解决方案。我不认为问题来自 Dataproc,这基本上只是 YARN 配置。在创建节点标签 (my-label
) 之后,脚本在 capacity-scheduler.xml
中设置以下属性:
<property>
<name>yarn.scheduler.capacity.root.accessible-node-labels</name>
<value>my-label</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.accessible-node-labels.my-label.capacity</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.accessible-node-labels</name>
<value>my-label</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.accessible-node-labels.my-label.capacity</name>
<value>100</value>
</property>
根据脚本附带的评论,"set accessible-node-labels
on both root
(the root queue) and root.default
(the default queue applications actually get run on)"。 root.default
部分是我测试中缺少的部分。两者的容量都设置为 100。
然后,需要重新启动 YARN (systemctl restart hadoop-yarn-resourcemanager.service
) 以验证修改。
在那之后,我能够开始在我的问题中未能完成的工作。
希望对遇到相同或类似问题的人有所帮助。