我有这个代码片段,我在本地独立模式下运行,只使用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列,所有列都具有字符串struct的数组的5列除外。数据类型。数据大小为3.1 MB。
同时,这里有一些关于运行代码的环境的信息:
- spark.executor。核心:2
- spark.executor。id:司机
- spark.driver。内存:1000
问题是我不知道为什么阶段1需要12分钟才能完成,它只需要计数100条记录。我找不到什么"扫描镶板"one_answers";Exchange"任务的含义如下图所示:第一阶段DAG可视化
我的问题是,是否有更系统的方法来理解这些任务的含义。作为一个初学者,我非常依赖Spark UI,但它并没有提供太多关于它执行的任务的信息。我能找到哪个任务花了最多的时间,但我不知道为什么会这样,也不知道如何系统地解决它。
spark代码中的运行时间是基于集群启动时间、DAG调度器优化时间、运行阶段时间来计算的。在您的情况下,问题可能是由于以下原因:
- 拼花文件数。要测试这一点,很容易读取表并将其作为一个拼花文件写回来。你正在调用一个table,但是在后台,它正在读取物理的parquet文件,所以文件的数量是一个需要考虑的项目。
- 火花簇数。集群的数量应该与您拥有的计算资源的数量相关。例如,在您的示例中,您有2个核心和一个小大小的表。所以只有几个分区比默认的200个分区更有效。
使用explain
函数并读取DAG结果来获得更多关于火花级的说明。由于这个函数,您可以看到并比较由内部优化器进程计算的Analyzed Logical Plan
、Optimized Logical Plan
和Physical Plan
。
查看explain
函数的详细描述,请访问此链接