我正在开发一个glue spark作业脚本,使用glue development endpoint分配了4个dpu。根据glue文档,1个dpu等于2个执行器,每个执行器可以运行4个任务。1个dpu预留给主控,1个执行器预留给驱动。现在,当我的开发端点有4个dpu时,我期望有5个执行者和20个任务。
我正在开发的脚本使用jdbc连接加载了100万行。然后我将一百万行分区合并成5个分区,并使用 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"])
...
1条答案
按热度按时间btxsgosb1#
这很可能是对jdbc数据源打开的连接的限制,太少的连接会降低并行性,太多的连接可能会加重数据库的负担。通过调整此处的选项来提高并行度。
因为您是作为Dataframe读取,所以可以设置上下限和分区列。更多信息可以在这里找到。
为了正确地调整dpu的大小,我建议将spark ui链接起来,这样有助于缩小在dag上花费的时间和任务的实际分布。