接下来,再次查看最长阶段的 I/O 统计信息:
什么是高输入/输出?
I/O 列中需要多少数据才能被视为达到较高的标准? 要弄清楚这一点,首先从任意给定列中的最高数字开始。 然后,考虑一下在所有工作节点中拥有的 CPU 核心总数。 通常,每个核心每秒可以读取和写入大约 3 MB。
将最大 I/O 列的数值除以群集工作节点的核心数,然后将结果再除以持续时间(秒)。 如果结果约为 3 MB,则可能是 I/O 绑定。 这将是高输入/输出。
高输入
如果你在这个阶段接收到大量输入,这意味着你花费了很多时间在数据读取上。 首先,确定此阶段正在读取的数据。 请参阅 在 Spark 的 DAG 中识别高成本读取。
确定特定数据后,下面是加快读取速度的一些方法:
- 使用 Delta。
- 使用流体集群技术来优化数据跳过。 请参阅对表使用 liquid 聚类分析。
- 试用 Photon。 它可以大大提高读取速度,尤其是在处理宽表时。
- 使查询更具选择性,因此不需要读取尽可能多的数据。
- 重新考虑你的数据布局,以便数据跳过更加有效。
- 如果要多次读取相同的数据,请使用 Delta 缓存。
- 如果要执行连接操作,请考虑尝试使 DFP 正常工作。
- 增加 群集的大小。
高输出
如果你看到阶段中的大量输出,这意味着你花了很多时间写入数据。 下面是解决此问题的一些方法:
- 是否重写大量数据? 请参阅 如何确定 Spark 是否正在重写要检查的数据 。 如果要重写大量数据:
- 如果尚未启用 Photon,请启用 Photon 。 Photon 可以大大提高写入速度。
- 增加 群集的大小。
高度随机排序
Databricks 建议你设置为 spark.sql.shuffle.partitions=auto
允许 Spark 自动选取最佳随机分区数。 如果你不熟悉混排,是时候 学习了。
无高性能I/O
如果在任一列中看不到高输入/输出,则需要更深入地挖掘。 查看 性能低下且 I/O 活动较少的 Spark 阶段。