运行 Spark on DataProc 时如何对新作业进行排队

How to queue new jobs when running Spark on DataProc

如何将多个作业提交到 Google Dataproc (PySpark) 并将不适合当前执行程序的作业排队?

仅提交作业不适用于排队,这里是任何以下作业的输出:

 $ gcloud dataproc jobs submit pyspark myjob.py
 ...
 WARN  Utils:70 - Service 'SparkUI' could not bind on port 4040. Attempting port 4041
为此,

YARN 应该采用 "queue" 参数。但是,我找不到任何关于将它与 dataproc 一起使用的文档...?

在您的情况下,您可能只想忽略该警告;这实际上只是一个无害的警告,你的 driver 确实在同一个集群上正确排队;当多个 driver 在同一主机(dataproc 主机)上 运行 时,端口只是 bound to successive port numbers starting at 4040。请注意,这 而不是 意味着后面的提交会主动等待第一个提交完成;作业提交会尝试 运行 尽可能多地同时存在资源。在 Dataproc 中,如果您提交 100 个作业,您应该会看到其中 10 个(因机器大小、集群大小等而异)立即在 YARN 中排队,其中几个(或全部)将成功获得足够的 YARN 容器开始 运行ning,而其他容器在 YARN 中保持 PENDING。当它们完成时,Dataproc 将在资源可用时将剩余的 90 个作业递增地提交给 YARN。

目前没有对 YARN 队列的专门支持,但如果您想在 cluster-creation 时使用以下方法自定义 YARN 队列,则支持它:

gcloud dataproc clusters create --properties \
    ^;^yarn:yarn.scheduler.capacity.root.queues=foo,bar,default;spark:other.config=baz

(替换 gcloud delimiter with ; to pass through the comma-separated list) and/or additional yarn-site.xml configs as outlined in tutorials like this one,然后您指定队列:

gcloud dataproc jobs submit spark --properties spark.yarn.queue=foo

尽管这不会改变您看到的有关端口 4040 警告的内容。这是因为Spark默认设置为yarn-client模式,即driver程序运行在master节点上,driver提交不受YARN排队.

您可以使用yarn-cluster模式如下:

gcloud dataproc jobs submit spark --properties \
    spark.master=yarn-cluster,spark.yarn.queue=foo

然后它将使用 foo yarn-queue 如果你定义了它,以及使用 yarn-cluster 模式以便 driver 程序 运行s 在 YARN 容器中。在这种情况下,您将不再遇到任何端口 4040 警告,但在 yarn-cluster 模式下,您也不会在 Dataproc [=44] 中看到 driver 程序的 stdout/stderr =] 了。