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

nor*_*bjd 5 hadoop hadoop-yarn apache-spark google-cloud-dataproc

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

  • 使用Spark时,如果指定--conf spark.yarn.am.nodeLabelExpression="my-label",则无法启动作业(在上阻止Submitted application [...],请参见下面的详细信息)。

  • 对于YARN应用程序(如distributedshell),在指定时-node_label_expression my-label,该应用程序无法启动

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

YARN节点标签设置

我正在使用Google Dataproc运行我的集群(例如:4个工作线程,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'
Run Code Online (Sandbox Code Playgroud)

打包的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"
Run Code Online (Sandbox Code Playgroud)

我可以在YARN Web UI中看到创建的标签:

在YARN上创建的标签

火花

当我运行一个简单的示例(SparkPi)而不指定有关节点标签的信息时:

spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master yarn \
  --deploy-mode client \
  /usr/lib/spark/examples/jars/spark-examples.jar \
  10
Run Code Online (Sandbox Code Playgroud)

在YARN Web UI的Scheduler选项卡中,我看到了在上启动的应用程序<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
Run Code Online (Sandbox Code Playgroud)

作业未启动。从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另一个)相关的队列没有足够的资源来运行作业:

接受Spark工作

这里,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
Run Code Online (Sandbox Code Playgroud)

或增加这些属性:

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
Run Code Online (Sandbox Code Playgroud)

没有成功也没有。

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
Run Code Online (Sandbox Code Playgroud)

应用程序无法启动,并且日志不断重复:

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并成功。

问题

  • 我在标签上做错了吗?但是,我遵循了官方文档本指南
  • 这是与Dataproc相关的特定问题吗?因为以前的指南似乎适用于其他环境
  • 也许我需要创建一个特定的队列并将其与我的标签相关联?但是,由于我正在运行“一次性快照”集群来运行单个Spark作业,因此我不需要特定的队列,因此在我的用例中,在默认根目录下运行作业不是问题

感谢您的帮助

nor*_*bjd 5

一位 Google 工程师回答了我们(在我们提出的私人问题上,而不是在 PIT 中),并通过为 Dataproc 集群创建指定初始化脚本为我们提供了解决方案。我不认为问题来自 Dataproc,这基本上只是 YARN 配置。该脚本在 中设置以下属性capacity-scheduler.xml,就在创建节点标签 ( my-label) 之后:

<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>
Run Code Online (Sandbox Code Playgroud)

从与脚本一起进行的注释来看,这“accessible-node-labelsroot(根队列) root.default(实际运行的默认队列应用程序)上都设置了”。这root.default部分是我的测试中缺少的部分。两者的容量都设置为 100。

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

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

希望能帮助有相同问题或类似问题的人。