首页 > 解决方案 > 分区 DataFrame 时 AWS Glue Spark 作业无法扩展

问题描述

我正在使用分配了 4 个 DPU 的 Glue 开发端点开发 Glue Spark 作业脚本。根据 Glue文档, 1 DPU 等于 2 个执行器,每个执行器可以运行 4 个任务。1 个 DPU 为 master 保留,1 个 executor 为驱动程序保留。现在,当我的开发端点有 4 个 DPU 时,我预计会有 5 个执行器和 20 个任务。

我正在开发的脚本使用 JDBC 连接加载 100 万行。然后我将一百万行分区合并为 5 个分区,并使用选项将其写入 S3 存储桶maxRecordsPerFile = 100000。整个过程需要34秒。然后我将分区数更改为 10,作业再次运行 34 秒。因此,如果我有 20 个任务可用,为什么脚本需要相同的时间来完成更多分区?

编辑:我开始使用实际作业执行脚本,而不是开发端点。我将工人数量设置为 10,工人类型设置为标准。查看指标,我可以看到我只有 9 个执行者而不是 17 个,并且只有 1 个执行者在做某事,其余的都是空闲的。

代码:

...

df = spark.read.format("jdbc").option("driver", job_config["jdbcDriver"]).option("url", jdbc_config["url"]).option(
    "user", jdbc_config["user"]).option("password", jdbc_config["password"]).option("dbtable", query).option("fetchSize", 50000).load()

df.coalesce(17)

df.write.mode("overwrite").format("csv").option(
    "compression", "gzip").option("maxRecordsPerFile", 1000000).save(job_config["s3Path"])

...

标签: apache-sparkaws-glue

解决方案


这很可能是对您的 jdbc 数据源打开的连接的限制,连接太少会降低并行性,太多可能会给您的数据库带来负担。通过调整此处的选项来增加并行度。

由于您是作为数据框读取的,因此您可以设置上限和分区列。更多可以在这里找到。

为了正确调整 DPU 的大小,我建议链接spark-ui,它可以帮助缩小所有时间的花费以及查看 DAG 时任务的实际分布。


推荐阅读