指定 YARN 节点标签时 YARN 应用程序无法启动

YARN applications cannot start when specifying YARN node labels

我正在尝试使用 YARN node labels 来标记工作节点,但是当我在 YARN(Spark 或简单的 YARN 应用程序)上 运行 应用程序时,这些应用程序无法启动。

这是我到目前为止所做的测试。

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 版本:

之后,我创建了一个标签 (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,我看到:

我怀疑与标签分区相关的队列(不是 <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 开始并成功。

问题

感谢您的帮助

一位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) 以验证修改。

在那之后,我能够开始在我的问题中未能完成的工作。

希望对遇到相同或类似问题的人有所帮助。