Dataproc 集群最多可并行运行 5 个作业,忽略可用资源

Posted

技术标签:

【中文标题】Dataproc 集群最多可并行运行 5 个作业,忽略可用资源【英文标题】:Dataproc cluster runs a maximum of 5 jobs in parallel, ignoring available resources 【发布时间】:2020-06-27 12:47:05 【问题描述】:

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

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

以下是 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

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

【问题讨论】:

【参考方案1】:

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

关于spark.driver.cores的问题,只在集群模式下有效,看这个doc:

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

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

【讨论】:

我刚试过这个,但我看到了同样的行为。 deployMode 现在是“集群”,但它仍然只有 4 个驱动程序内核。如果我查看提交的应用程序,它保留了我要求的 40 个,它只是没有使用它们。有什么想法吗? 驱动只有一个进程,受节点核数的限制。工作节点有多少个核心? 有两个节点,每个节点有 40 个 CPU 和 768GB RAM。 对不起,我是想问主节点。 啊,它有4个核心。

以上是关于Dataproc 集群最多可并行运行 5 个作业,忽略可用资源的主要内容,如果未能解决你的问题,请参考以下文章

在 Google Cloud DataProc 上安排 cron 作业

向 dataproc 集群提交 pyspark 作业时出错(找不到作业)

如何提交依赖于 google dataproc 集群的 pyspark 作业

Dataproc Pyspark 作业仅在一个节点上运行

如何检查 Dataproc 上 pyspark 作业的每个执行程序/节点内存使用指标?

AWS ECS Fargate 上的 Jenkins 工作人员:并行运行几个作业