我怀疑,如何在spark应用程序中执行各个阶段。程序员可以定义的阶段执行是否一致,还是由spark引擎派生?
答案 0 :(得分:5)
检查此图片中的实体(阶段,分区):
作业中的阶段(spark应用程序?)是否在spark中并行运行?
是的,如果没有顺序依赖,它们可以并行执行。
此处阶段1和阶段2分区可以并行执行,但不能执行阶段0分区,因为阶段1和阶段1中的依赖性分区。必须处理2。
执行可以定义的阶段是否有任何一致性 程序员还是它会由火花引擎派生出来?
阶段边界由在分区之间发生数据重排时定义。 (查看图片中的粉色线条)
答案 1 :(得分:3)
如何在Spark作业中执行
如果作业的阶段没有依赖关系,则可以并行运行。
在Spark中,阶段被边界分割。你有一个shuffle阶段,这是一个转换被分割的边界阶段,即reduceByKey
,你有一个结果阶段,这些阶段必然会产生一个结果而不会导致混乱,即{{{ 1}}操作:
(Picture provided by Cloudera)
由于map
是一个随机播放阶段,你会看到粉红色框中的分割,这标志着一个边界。
在内部,阶段进一步分为任务。例如,在上图中,groupByKey
的第一行可以分为三个任务,每个任务一个。
当一个转换输出是另一个转换输入时,我们需要串行执行。但是,如果阶段不相关,即textFile -> map -> filter
,它们可以并行运行。一旦他们从那个阶段宣布他们之间的依赖关系,他们将继续连续执行。