接下来,再次查看最长阶段的 I/O 统计信息:
高性能 I/O 是什么?
I/O 列中需要多少数据量才能被认为是高? 要弄清楚这一点,首先从任意给定列中的最高数字开始。 然后,考虑在所有工作人员中拥有的 CPU 核心总数。 通常,每个核心每秒可以读取和写入大约 3 MB。
将最大 I/O 列数值除以群集工作核心数,然后将结果除以持续时间秒数。 如果结果约为 3 MB,那么您可能受限于输入/输出操作。 这属于高 I/O 性能。
高输入
如果你在阶段中看到大量输入,这意味着你花了很多时间读取数据。 首先,确定此阶段正在读取的数据。 请参阅 在 Spark 的 DAG 中识别昂贵的读取。
确定特定数据后,下面是加快读取速度的一些方法:
- 使用 Delta。
- 使用液体聚类来更好地 数据跳跃。 请参阅 对表使用液体聚类分析。
- 试用 Photon。 它可以显著提升读取速度,尤其是在处理宽幅表格时。
- 使查询更具选择性,因此不需要读取尽可能多的数据。
- 重新考虑数据布局,以便数据跳过更有效。
- 如果要多次读取相同的数据,请使用 Delta 缓存。
- 如果您在进行连接操作,请考虑尝试让DFP运行起来。
- 增加 群集的大小 或使用 无服务器计算。
高功率
如果你看到阶段中的大量输出,这意味着你花了很多时间写入数据。 以下是解决此问题的一些方法:
- 是否重写大量数据? 请参阅如何确定 Spark 是否正在重写数据进行检查。 如果要重写大量数据:
- 如果尚未启用 Photon,请启用 Photon 。 Photon 有助于显著提高写入速度。
- 增加 群集的大小 或使用 无服务器计算。
高级洗牌
Databricks 建议你设置为 spark.sql.shuffle.partitions=auto 允许 Spark 自动选取最佳随机分区数。 如果你不熟悉混排,是时候 学习了。
无高输入/输出
如果在任一列中看不到高 I/O,则需要深入分析。 查看 具有少量 I/O 的慢速 Spark 阶段。