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

Posted

技术标签:

【中文标题】指定 YARN 节点标签时,YARN 应用程序无法启动【英文标题】:YARN applications cannot start when specifying YARN node labels 【发布时间】:2018-08-15 08:41:37 【问题描述】:

我正在尝试使用 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 运行我的集群(例如:4 个工作人员,preemptible nodes 上的 2 个工作人员)。我的目标是强制任何 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),并用这个标签更新了两个不可抢占的工人:

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,我看到:

YarnApplicationStateACCEPTED: 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 应用程序时的问题是相同的:

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 和this guide 这是与 Dataproc 相关的特定问题吗?因为之前的指南似乎适用于其他环境 也许我需要创建一个特定队列并将其与我的标签相关联?但由于我正在运行一个“一次性”集群来运行单个 Spark 作业,因此我不需要特定的队列,因此在默认根节点上运行作业对我的用例来说不是问题

感谢您的帮助

【问题讨论】:

嗨! GCP 支持在这里。重现您的问题后,我认为可能值得在Public Issue Tracker 报告它,以便在那里可以更好地跟踪它。这样,您将能够提供解决问题可能需要的其他信息。根据我们目前掌握的信息,我们无法确定您在此处面临的问题的根本原因,因此也许有更好的机会在 PIT 中进行跟踪。如果您这样做,请随时将其发布为答案,以便社区知道这一点。 您好,我们刚刚按照您的建议创建了一个问题。所以,据我了解,我们遇到的问题与 Dataproc 相关,而不是 YARN,对吧? 感谢您这样做。目前我们不知道问题出在哪里,但我希望我们在继续调查时能够获得更多信息。随时发布 PIT 的链接,以便社区也跟踪其解决方案。 【参考方案1】:

一位 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>

根据脚本的注释,“在root(根队列)root.default(默认队列应用程序实际运行)上设置accessible-node-labels” . root.default 部分是我的测试中缺少的部分。两者的容量都设置为 100。

然后,需要重新启动 YARN (systemctl restart hadoop-yarn-resourcemanager.service) 以验证修改。

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

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

【讨论】:

以上是关于指定 YARN 节点标签时,YARN 应用程序无法启动的主要内容,如果未能解决你的问题,请参考以下文章

Flinkflink-1.12 通过 -t 指定模式后无法指定yarn参数

Spark Yarn /tmp 没有这样的文件或目录

Yarn | 教你如何使用Capacity Scheduler node-labels特性

使用操作/设置节点时如何更改@yarn:github操作中的注册表

yarn publish 失败,因为 dist 文件夹被添加到 gitignore

Flink学习笔记:搭建Flink on Yarn环境并运行Flink应用