Apache spark AWS Glue Spark作业在对数据帧进行分区时不可伸缩

Apache spark AWS Glue Spark作业在对数据帧进行分区时不可伸缩,apache-spark,aws-glue,Apache Spark,Aws Glue,我正在使用Glue development endpoint开发Glue Spark作业脚本,该端点分配了4个DPU。根据Glue,1个DPU等于2个执行器,每个执行器可以运行4个任务。1个DPU预留给主机,1个执行器预留给司机。现在,当我的开发端点有4个DPU时,我希望有5个执行者和20个任务 我正在开发的脚本使用JDBC连接加载了100万行。然后我将一百万行分区合并成5个分区,并使用选项maxRecordsPerFile=100000将其写入S3 bucket。整个过程耗时34秒。然后,我将

我正在使用Glue development endpoint开发Glue Spark作业脚本,该端点分配了4个DPU。根据Glue,1个DPU等于2个执行器,每个执行器可以运行4个任务。1个DPU预留给主机,1个执行器预留给司机。现在,当我的开发端点有4个DPU时,我希望有5个执行者和20个任务

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

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

代码:


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

因为您是以数据帧的形式读取,所以可以设置上下限和分区列。可以找到更多


对于您的DPU,我建议将链接,这有助于在查看DAG时缩小所有时间的花费范围和任务的实际分配。

谢谢您的评论。您提供的第一个链接是关于DynamicFrames的,因为我必须读取两个日期之间的数据(自上次运行以来的最新数据),所以我认为不可能使用DynamicFrames。我还认为,当您对数据帧进行分区时,分区会均匀地分布在执行器和其中的任务之间,因此应该使用多个执行器。顺便问一下,如果我在查询中使用WHERE子句,那么上下边界是划分并读取我筛选的数据,还是仍然读取整个表?
...

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"])

...