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 正常运行。

高输出

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

高随机选择

如果你不熟悉随机选择,现在有学习的机会。

无高 I/O

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