如何让 Spark 作业使用 Google Cloud DataProc 集群上的所有可用资源?
How do I get a spark job to use all available resources on a Google Cloud DataProc cluster?
比如我目前有一个DataProc集群,由一个master和4个worker组成,每台机器有8个vCPU和30GB内存。
每当我向集群提交作业时,集群总共提交最多 11GB,并且只使用 2 个工作节点来完成工作,并且在这些节点上只使用 2 个 vCPU 资源。这使得原本只需要几分钟的工作需要将近一个小时才能执行。
我试过在主节点上编辑 spark-defaults.conf
文件,并尝试 运行 我的 spark-submit
命令和参数 --executor-cores 4 --executor-memory 20g --num-executors 4
但都没有任何效果.
这些集群只会启动以执行单个任务,然后会被拆除,因此不需要为任何其他作业保留资源。
您可能想看看您正在查看的内容是否与 有关 - YARN 报告的正在使用的 vcores 数量已知是不正确的,但这只是一个外观缺陷。在具有 8 核机器的 Dataproc 集群上,默认配置已经为每个执行程序设置了 4 个核心;如果您通过 YARN 单击 Spark appmaster,您应该会看到 Spark 确实能够为每个执行程序打包 4 个并发任务。
该部分解释了每个节点 "only using 2 vCPU" 的情况。
该作业仅涉及两个工作节点这一事实暗示它还有更多内容;您获得的并行度与 how well the data is partitioned 有关。如果您有无法拆分的 gzip 文件之类的输入文件,那么不幸的是,没有一种简单的方法可以提高输入并行度。但是,至少在稍后的管道阶段或者如果您确实有可拆分文件,您可以通过在读取时指定 Spark 分区的数量或通过在代码中调用 repartition
来增加并行性。根据您的输入大小,您还可以尝试减少 fs.gs.block.size
;默认为 134217728
(128MB),但您可以通过在集群创建时设置为一半或四分之一或其他值:
--properties core:fs.gs.block.size=67108864
或在作业提交时:
--properties spark.hadoop.fs.gs.block.size=67108864
我设法通过将调度程序更改为 FIFO
而不是 FAIR
来解决我的问题,在我的 create
命令末尾使用以下内容:
--properties spark:spark.scheduler.mode=FIFO
比如我目前有一个DataProc集群,由一个master和4个worker组成,每台机器有8个vCPU和30GB内存。
每当我向集群提交作业时,集群总共提交最多 11GB,并且只使用 2 个工作节点来完成工作,并且在这些节点上只使用 2 个 vCPU 资源。这使得原本只需要几分钟的工作需要将近一个小时才能执行。
我试过在主节点上编辑 spark-defaults.conf
文件,并尝试 运行 我的 spark-submit
命令和参数 --executor-cores 4 --executor-memory 20g --num-executors 4
但都没有任何效果.
这些集群只会启动以执行单个任务,然后会被拆除,因此不需要为任何其他作业保留资源。
您可能想看看您正在查看的内容是否与
该部分解释了每个节点 "only using 2 vCPU" 的情况。
该作业仅涉及两个工作节点这一事实暗示它还有更多内容;您获得的并行度与 how well the data is partitioned 有关。如果您有无法拆分的 gzip 文件之类的输入文件,那么不幸的是,没有一种简单的方法可以提高输入并行度。但是,至少在稍后的管道阶段或者如果您确实有可拆分文件,您可以通过在读取时指定 Spark 分区的数量或通过在代码中调用 repartition
来增加并行性。根据您的输入大小,您还可以尝试减少 fs.gs.block.size
;默认为 134217728
(128MB),但您可以通过在集群创建时设置为一半或四分之一或其他值:
--properties core:fs.gs.block.size=67108864
或在作业提交时:
--properties spark.hadoop.fs.gs.block.size=67108864
我设法通过将调度程序更改为 FIFO
而不是 FAIR
来解决我的问题,在我的 create
命令末尾使用以下内容:
--properties spark:spark.scheduler.mode=FIFO