让我们考虑一下使用spark的python伪代码片段。
rdd1 = sc.textFile("...")
rdd2 = rdd1.map().groupBy().filter()
importantValue = rdd2.count()
rdd3 = rdd1.map(lambda x : x / importantValue)
在Spark任务的
DAG
中,创建了rdd1
之后,有两个分支。两个分支都使用rdd1
,但是第二个分支(计算rdd3
)也使用rdd2
(importantValue
)的聚合值。我认为DAG
看起来像这样:我对吗?如果是,是否可以假定计算
rdd1
中使用的rdd3
仍在内存中处理?还是我们必须缓存rdd1
以避免重复加载?更一般而言,如果
DAG
看起来像这样:我们是否可以假设两个分支都是并行计算的,并使用
rdd1
的相同副本?还是Spark驱动程序将一个接一个地计算这些分支,因为这是两个不同的阶段?我知道在执行之前,spark驱动程序将DAG
分为阶段和更详细的逻辑部分-tasks
。一个阶段内的任务可以并行计算,因为其中没有任何随机阶段,但是像图像中的两个并行分支呢?我知道所有的直觉都属于rdd抽象(惰性评估等),但这并不能使事情更容易理解。请给我任何建议。 最佳答案
是。
否。Spark利用惰性评估来处理数据。这意味着在需要之前不会进行任何计算。除非有明确的声明,否则不会存储任何内容。
确实,您需要缓存rdd1以防止文本文件被读取两次。
这两个分支具有不同的世系,因此不会并行处理。通常,在采取任何措施之前不会处理任何数据。每当需要结果(读取结果,需要执行操作)时,将进行给定谱系中所有进行中的转换和当前操作的数据处理。之后,除非调用cache
,否则内存中将不存在任何数据。
有关转换与操作的说明,请参见deck