aws glue spark作业在对Dataframe进行分区时不可伸缩

pdkcd3nj  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(510)

我正在开发一个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"])

...
btxsgosb

btxsgosb1#

这很可能是对jdbc数据源打开的连接的限制,太少的连接会降低并行性,太多的连接可能会加重数据库的负担。通过调整此处的选项来提高并行度。
因为您是作为Dataframe读取,所以可以设置上下限和分区列。更多信息可以在这里找到。
为了正确地调整dpu的大小,我建议将spark ui链接起来,这样有助于缩小在dag上花费的时间和任务的实际分布。

相关问题