Spark 阶段高 I/O

接下来,再次查看最长阶段的 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

高输出

如果看到大量阶段输出,这意味着花费了大量时间来写入数据。 以下是解决此问题的一些方法:

高随机选择

如果不熟悉 shuffle,现在正是学习的大好时机。

无高 I/O

如果在任一列中都看不到高 I/O,则需要更深入发掘。 请参阅 Spark 阶段速度慢,几乎无 I/O