【问题标题】:spark : duplicate stages while using joinspark : 使用 join 时重复阶段
【发布时间】:2017-05-24 13:27:22
【问题描述】:

我正在使用 spark java api,我注意到这个我无法解释的奇怪事情。如您所见

这是我的程序执行的 dag 可视化,没有其他阶段使用阶段 3 的计算,阶段 3 中的三个操作也正是阶段 2 的前 3 个操作,所以我的问题,为什么阶段 3 单独计算?我还运行了没有最后一次连接操作的程序,它给出了以下 dag,

注意这里没有像前一个那样的并行阶段。我相信由于这个无法解释的第 3 阶段,我的程序正在放慢速度。

PS:我对 spark 很陌生,这是我的第一个 stackoverflow 问题,如果离题或需要更多详细信息,请告诉我。

【问题讨论】:

  • 你能显示代码吗?我可以尝试复制自己,但会感谢您提供的任何帮助。谢谢!
  • 我的 猜测 是在 Web UI 中绘制 RDD 谱系图是一个问题。您可以在 join 之后的 RDD 上 toDebugString 并将其粘贴到您的问题中吗?

标签: java apache-spark


【解决方案1】:

看起来连接操作需要 2 个输入:

  1. 第 2 阶段第三次操作的映射结果
  2. 第二阶段的第六次操作 flatMap 的结果

Spark 在计划计算时只查看一个阶段。它不知道它需要保留两组值。这可能导致在计算后面的步骤时覆盖第 3 步的值。当它到达需要两组值的join 时,它会意识到它需要这些缺失值并将重新计算它们,这就是为什么您会看到重现阶段 2 第一部分的附加阶段。

您可以告诉它保存中间值以供以后使用,方法是在 map 操作生成的 RDD 上调用 .cache(),然后加入从 cache() 返回的 RDD。这将导致 spark 尽最大努力将这些值保留在内存中。您可能仍会看到新阶段出现,但如果有足够的可用内存来存储值,它应该会立即完成。

【讨论】:

  • 我认为这只是一个 UI 问题,认为 Stage 3 应该真正连接到 Stage 4。
猜你喜欢
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多