我是 Spark 的新手,我正在尝试了解与我的 Spark 应用程序(通过 Dataset API 开发)相关的 Web UI 中的指标。我看过 Spark Summit 和 Databricks 的一些视频,我观看的大部分视频都是关于 Web UI 的一般概述,例如:阶段/作业/任务的定义,如何理解什么时候不能正常工作(例如不平衡执行者之间的工作),关于编程时要避免的事情的建议等。
但是,我找不到每个性能指标的详细说明。特别是我有兴趣了解以下图像中与包含 groupBy(Col1, Col2)、orderBy(Col1, Col2) 和 show() 的查询相关的内容。
如果我理解得很好,默认的最大分区大小设置为 128 MB。由于我的数据集大小为 1378MB,我得到了 11 个使用 128MB 的任务,对吧?由于在第一阶段我做了一些过滤(在应用 groupBy 之前)任务写入内存,所以 Shuffle Write 是 108.3KB 但为什么我会在第二阶段获得 200 个任务?
在groupBy之后我使用了orderBy,任务的数量是与我的数据集的情况有关还是与它的大小有关?
更新:我发现这个spark.sql.shuffle.partitions 的 200 个默认分区难题和其他一些问题,但现在我想知道它是否有特定的原因是 200?
为什么有些任务在这里有结果序列化?如果我理解得很好,那么序列化与输出有关,所以任何 show()、count()、collect() 等。但在这个阶段,这些操作不存在(在 groupBy 之前)。
结果序列化时间占很大一部分是否正常?我调用了 show() (默认情况下需要 20 行,并且有一个 orderBy),所以所有任务都并行运行并且序列化了它的所有记录?
为什么只有一项任务有相当长的随机读取时间?我希望所有人都至少有少量的随机读取时间,这又与我的数据集有关?
反序列化时间与读取我的数据集文件有关吗?我问是因为我没想到它在那里,因为它是第 1 阶段并且它已经存在于第 0 阶段。
由于我正在处理从同一数据集开始的 3 个查询,因此我在第一个查询的开头使用了 cache()。我想知道为什么它显示 739.9MB / 765 [输入大小/记录] ...在第一个查询中它显示 1378.8 MB / 7647431 [输入大小/记录]。
我猜它有 11 个任务,因为缓存的数据集大小仍然是 1378MB,但 765 与最初的 7647431 相比是一个非常低的数字,所以我认为它与记录/行无关,对吧?
谢谢阅读。