说我有这样的代码,其中 x 是RDD。
val a = x.map(...)
val b = x.map(...)
val c = x.map(...)
....
// a, b and c are used later on
出于某种原因,我希望 b 仅在 a 执行完成后执行,而 c 仅在执行后执行 b 已完成。有没有办法在Spark中强制这种依赖?
其次,Spark执行此类代码的默认机制是什么。是否会并行执行 a , b 和 c 的执行,因为它们之间没有依赖关系?
答案 0 :(得分:1)
我所做的通常是重构我的代码,以便当我调用强制评估b的动作时,必须在a之后调用它。我没有看到直接操纵DAG的方法。
至于你的第二个问题。在行动之前,a,b和c将不会被执行。如果动作是并行调用的,例如在期货中,则它们将由并行的火花运行。如果他们都按顺序调用,spark会在Sequence
中调用它们澄清。如果你调用a.count()。那会阻止。因此,强制执行b和c的操作无法执行,因此它们不会并行运行。但是,如果你打电话给:
Future(a.count())
Future(b.count())
Future(c.count())
然后地图将并行发生。将调用每个动作,这将强制评估阶段。然后,spark将根据您拥有的执行程序核心总数来处理每个阶段的任务。