Spark 阶段高 I/O
接下来,再次查看最长阶段的 I/O 统计信息:
什么是高 I/O?
I/O 列中需要有多少数据才能被视为高 I/O? 要弄清楚这一点,首先从任意给定列中的最大数量开始。 然后,考虑在所有辅助角色中拥有的 CPU 核心总数。 通常,每个核心每秒可以读取和写入大约 3 MB。
将最大 I/O 列除以群集辅助角色核心数,然后除以持续时间秒数。 如果结果约为 3 MB,则可能是 I/O 绑定。 这将是高 I/O。
高输入
如果看到大量阶段输入,这意味着花费了大量时间来读取数据。 首先,确定此阶段正在读取的数据。 请参阅识别 Spark DAG 中的昂贵读取。
确定特定数据后,以下是加快读取速度的一些方法:
- 使用 Delta。
- 试用 Photon。 它可以显著提高读取速度,特别是对于宽表。
- 让查询更具选择性,以减少所需的数据读取量。
- 重新考虑数据布局,以便数据跳过更加有效。
- 如果要多次读取相同的数据,请使用 Delta 缓存。
- 如果要进行联接,请考虑尝试使用 DFP。
高输出
如果看到大量阶段输出,这意味着花费了大量时间来写入数据。 以下是解决此问题的一些方法:
- 是否重写大量数据? 请参阅如何确定 Spark 是否正在重写数据进行检查。 如果要重写大量数据:
- 启用 Photon(如果尚未启用)。 Photon 有助于显著提高写入速度。
高随机选择
如果不熟悉 shuffle,现在正是学习的大好时机。
无高 I/O
如果在任一列中都看不到高 I/O,则需要更深入发掘。 请参阅 Spark 阶段速度慢,几乎无 I/O。