Apache Spark如何实现shuffle阶段?

时间:2015-04-21 16:35:32

标签: hadoop mapreduce apache-spark

我想知道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进行隐式缓存?

1 个答案:

答案 0 :(得分:0)

不,Spark表现得略有不同。首先,当遇到您编写的行时,Spark不会执行实际操作,但它会创建要执行的操作的DAG以获取给定的RDD或结果。事实上,Spark的业务分为两大类:转型和行动;只有在遇到动作时才会执行它们。

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

之前的陈述并非如此。实际上,手册中说here

  

Spark还会在shuffle中自动保留一些中间数据   操作(例如reduceByKey),即使没有用户调用持久化。   这样做是为了避免在节点发生故障时重新计算整个输入   在洗牌期间。我们仍然建议用户呼叫坚持   如果他们计划重复使用它,就会产生RDD。