apache-spark - 分区 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"])
...
解决方案
推荐阅读
- timer - 在 CAPL 中创建一个可暂停的计时器
- google-apps-script - 粘贴到错误的单元格
- javascript - Google Apps 脚本删除自动电子邮件中的 html 标签
- typescript - 在 TypeScript 中复制相同键属性错误
- postgresql - 加速 Postgres Group
- multithreading - SOCK_STREAM 套接字的多线程使用
- c# - 如何使用 Excel-DNA 构建 XLL
- javascript - 单击锚元素时:目标元素上是否触发了任何事件?
- r - 使用超过 11 种颜色更改堆栈条图中的颜色
- sql - 我是否应该将两个表合并为一张表以提高查询性能