Spark 阶段高 I/O

接下来,再次查看最长阶段的 I/O 统计信息:

长阶段 I/O

什么是高输入/输出?

I/O 列中需要多少数据才能被视为达到较高的标准? 要弄清楚这一点,首先从任意给定列中的最高数字开始。 然后,考虑一下在所有工作节点中拥有的 CPU 核心总数。 通常,每个核心每秒可以读取和写入大约 3 MB。

将最大 I/O 列的数值除以群集工作节点的核心数,然后将结果再除以持续时间(秒)。 如果结果约为 3 MB,则可能是 I/O 绑定。 这将是高输入/输出。

高输入

如果你在这个阶段接收到大量输入,这意味着你花费了很多时间在数据读取上。 首先,确定此阶段正在读取的数据。 请参阅 在 Spark 的 DAG 中识别高成本读取

确定特定数据后,下面是加快读取速度的一些方法:

  • 使用 Delta
  • 使用流体集群技术来优化数据跳过。 请参阅对表使用 liquid 聚类分析
  • 试用 Photon。 它可以大大提高读取速度,尤其是在处理宽表时。
  • 使查询更具选择性,因此不需要读取尽可能多的数据。
  • 重新考虑你的数据布局,以便数据跳过更加有效。
  • 如果要多次读取相同的数据,请使用 Delta 缓存
  • 如果要执行连接操作,请考虑尝试使 DFP 正常工作。
  • 增加 群集的大小

高输出

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

高度随机排序

Databricks 建议你设置为 spark.sql.shuffle.partitions=auto 允许 Spark 自动选取最佳随机分区数。 如果你不熟悉混排,是时候 学习了。

无高性能I/O

如果在任一列中看不到高输入/输出,则需要更深入地挖掘。 查看 性能低下且 I/O 活动较少的 Spark 阶段