首页 > 解决方案 > Dataproc 集群最多可并行运行 5 个作业,忽略可用资源

问题描述

我正在使用 Spark 作业将 1200 个 MS SQL Server 表中的数据加载到 BigQuery 中。这都是编排的 ETL 流程的一部分,其中 spark 作业由从 PubSub 接收消息的 scala 代码组成。因此,在大约一个小时的时间内收到了 1200 条消息。每条消息都会触发代码(异步),该代码从表中读取数据,进行少量转换,然后写入 BigQuery。该过程本身运行良好。我的问题是,尽管有很多“工作”在等待并且有大量可用资源,但 spark 中的活动工作数量永远不会超过 5。

我尝试将 spark.driver.cores 提高到 30,但没有任何变化。此外,此设置虽然在 Google 控制台中可见,但似乎无法通过实际的 spark 作业(在 spark UI 中查看时)。这是在控制台中运行的 spark 作业:

在此处输入图像描述

以下是火花作业属性:

在此处输入图像描述

这是一个相当大的集群,有大量资源可供使用:

在此处输入图像描述

这是创建集群的命令行:

gcloud dataproc clusters create odsengine-cluster \
--properties dataproc:dataproc.conscrypt.provider.enable=false,spark:spark.executor.userClassPathFirst=true,spark:spark.driver.userClassPathFirst=true \
--project=xxx \
--region europe-north1 \
--zone europe-north1-a \
--subnet xxx \
--master-machine-type n1-standard-4 \
--worker-machine-type m1-ultramem-40 \
--master-boot-disk-size 30GB \
--worker-boot-disk-size 2000GB \
--image-version 1.4 \
--master-boot-disk-type=pd-ssd \
--worker-boot-disk-type=pd-ssd \
--num-workers=2 \
--scopes cloud-platform \
--initialization-actions gs://xxx/cluster_init/init_actions.sh

以及提交 spark 作业的命令行:

gcloud dataproc jobs submit spark \
--project=velliv-dwh-development \
--cluster odsengine-cluster \
--region europe-north1 \
--jars gs://velliv-dwh-dev-bu-dcaods/OdsEngine_2.11-0.1.jar \
--class Main \
--properties \
spark.executor.memory=35g,\
spark.executor.cores=2,\
spark.executor.memoryOverhead=2g,\
spark.dynamicAllocation.enabled=true,\
spark.shuffle.service.enabled=true,\
spark.driver.cores=30\
-- yarn

我知道我可以考虑使用分区来分散大型单个表的负载,并且我也在另一个场景中成功地工作过,但在这种情况下,我只想一次加载多个表而不对每个表进行分区桌子。

标签: apache-sparkgoogle-cloud-dataproc

解决方案


关于“大量工作等待和大量可用资源”,我建议您检查 Spark 日志、YARN Web UI 和日志,看看是否有待处理的应用程序以及原因。它还有助于检查集群 Web UI 的监控选项卡以了解 YARN 资源利用率。

关于这个spark.driver.cores问题,它仅在集群模式下有效,请参阅此文档

驱动进程使用的核心数,仅在集群模式下

在 Dataproc 中,Spark 驱动程序默认以客户端模式运行,这意味着驱动程序运行在 YARN 之外的主节点上。您可以在集群模式下将驱动程序作为具有属性的 YARN 容器运行spark.submit.deployMode=cluster


推荐阅读