Apache Spark是如何实现shuffle阶段的



我想知道Apache Spark是如何实现shuffle阶段的。它使用了与MapReduce中相同的技术吗?例如:

rddB = rddA.map1.groupByKey();
rddX = rddB.map2.map3.saveAsTextFile();
rddY = rddB.map4.map5.saveAsTextFile();

它是否执行map1,然后按键分区并将中间数据保存在磁盘(内存)上?

然后读取中间文件2次,一次用于map2-map3分支,第二次用于map4-map5,尽管我们没有对rddB进行隐式缓存,但没有再次计算rddB?

不,Spark的行为方式略有不同。首先,当遇到您编写的行时,Spark实际上并不执行操作,但它创建了要执行的操作的DAG,以获得给定的RDD或结果。事实上,Spark的操作分为两大类:转换和操作;它只在遇到操作时执行它们。

此外,Spark只在您告诉它这样做时存储中间结果,即在RDD上调用persistcache时。如果你不这样做,它将执行所有的操作,以获得给定的结果,直到DAG的根(即从文件中读取它们)。

前面的说法并不真实。事实上,手册上写着

Spark还自动将一些中间数据保持在shuffle中操作(例如reduceByKey),即使没有用户调用persistent。这样做是为了避免在节点出现故障时重新计算整个输入在洗牌过程中。我们仍然建议用户在如果他们计划重复使用,则会产生RDD。

相关内容

  • 没有找到相关文章

最新更新