apachespark如何实现洗牌阶段?

xriantvc  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(341)

我想知道apachespark是如何实现洗牌阶段的。它是否使用与mapreduce相同的技术?例如:

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

它是否执行map1然后按键分区并将中间数据保存在磁盘(内存)上?
然后读取中间文件两次,一次用于map2 map3分支,第二次用于map4map5,而不再次计算rddb,即使我们没有对rddb执行隐式缓存?

yhxst69z

yhxst69z1#

不,spark的行为方式略有不同。首先,spark在遇到您所写的行时实际上不执行操作,但是它创建了一个要执行的操作的dag,以获得给定的rdd或结果。实际上,spark的操作分为两大类:转换和操作;它只在遇到操作时执行它们。
此外,spark仅在您告诉它这样做时(即调用时)才存储中间结果 persist 或者 cache 在rdd上。如果不这样做,它将执行所有操作,以获得到dag根的给定结果(即从文件中读取它们)。
前面的说法不太正确。实际上,手册上说
spark还会在shuffle操作中自动持久化一些中间数据(例如reducebykey),即使用户不调用persist。这样做是为了避免在洗牌期间节点失败时重新计算整个输入。如果用户打算重用rdd,我们仍然建议他们在生成的rdd上调用persist。

相关问题