我想知道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进行隐式缓存?
答案 0 :(得分:0)
不,Spark表现得略有不同。首先,当遇到您编写的行时,Spark不会执行实际操作,但它会创建要执行的操作的DAG以获取给定的RDD或结果。事实上,Spark的业务分为两大类:转型和行动;只有在遇到动作时才会执行它们。
此外,Spark只在您告知它时才存储中间结果,即当您在RDD上调用persist
或cache
时。如果你不这样做,它将执行所有操作以获得直到DAG根目录的给定结果(即从文件中读取它们)。
之前的陈述并非如此。实际上,手册中说here
Spark还会在shuffle中自动保留一些中间数据 操作(例如reduceByKey),即使没有用户调用持久化。 这样做是为了避免在节点发生故障时重新计算整个输入 在洗牌期间。我们仍然建议用户呼叫坚持 如果他们计划重复使用它,就会产生RDD。