我正在使用spark java api,我已经注意到这个我无法解释的奇怪的事情。正如您在
中看到的那样这是我的程序执行的dag可视化,没有其他阶段使用阶段3的计算,第3阶段的三个操作正好是阶段2的前3个操作,所以我的问题,为什么阶段3单独计算?我还运行了没有最后一次连接操作的程序,它提供了以下dag,
注意这里没有像前一个那样的平行阶段。我相信由于这个无法解释的第3阶段,我的计划正在放缓。
PS:我很新兴,这是我的第一个stackoverflow问题,请告诉我这是不是主题或需要更多细节。
答案 0 :(得分:1)
看起来连接操作需要2个输入:
Spark在计划计算时会查看单个阶段。它不知道它需要保留两组值。这可能导致在计算后续步骤时覆盖第3步值。当它到达需要两组值的join
时,它将意识到它需要那些缺失值并将重新计算它们,这就是为什么你会看到再现阶段2的第一部分的附加阶段。
通过从映射操作调用生成的RDD上的.cache()
,然后加入从cache()
返回的RDD,可以告诉它保存中间值以供日后使用。这将导致火花尽最大努力将这些值保存在内存中。您可能仍会看到新阶段出现,但如果有足够的可用内存来存储值,它应该立即完成。