是否有更系统的方法来解决缓慢的 AWS Glue + PySpark 执行阶段?

Is there a more systematic way to resolve a slow AWS Glue + PySpark execution stage?

我有这个代码片段,我 运行 在本地以独立模式仅使用 100 条记录:

from awsglue.context import GlueContext
glue_context = GlueContext(sc)
glue_df = glue_context.create_dynamic_frame.from_catalog(database=db, table_name=table)
df = glue_df.toDF()
print(df.count())

该架构包含 89 列,除了 5 列具有 array of struct 数据类型外,所有列都具有 string 数据类型。数据大小为 3.1 MB。

此外,这里有一些关于 运行 代码所用环境的信息:

问题是我无法找出为什么第 1 阶段需要 12 分钟才能完成,而它只需要计算 100 条记录。我无法找到“扫描镶木地板”和“交换”任务的含义,如下图所示: Stage 1 DAG Visualization

我的问题是,是否有更系统的方法来理解这些任务的含义。作为初学者,我非常依赖 Spark UI 但它并没有提供太多关于它已执行的任务的信息。我能够找到哪个任务花费的时间最多,但我不知道为什么会这样,也不知道如何系统地解决它。

spark代码中的运行时间是根据集群启动时间、DAG调度器优化时间、运行阶段时间计算的。在您的情况下,问题可能是由于以下原因造成的:

  • 实木复合地板文件的数量。要对此进行测试,请轻松阅读 table 并将其作为一个镶木地板文件写回。您正在调用 table 但在后台,它正在读取物理镶木地板文件,因此文件数量是一个需要考虑的项目。
  • 火花簇的数量。集群的数量应该是您拥有的计算资源的相关数量。例如,在您的情况下,您有 2 个小尺寸 table 的核心。因此,只有几个分区而不是默认分区数 200 会更有效率。

要获得有关 spark 阶段的更多说明,请使用 explain 函数并阅读 DAG 结果。作为此功能的结果,您可以查看并比较由内部优化程序计算的 Analyzed Logical PlanOptimized Logical PlanPhysical Plan

要查找 explain 函数的更详细说明,请访问此 LINK