让我们考虑一下使用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看起来像这样:
python - 执行顺序和缓存需求-LMLPHP
我对吗?如果是,是否可以假定计算rdd1中使用的rdd3仍在内存中处理?还是我们必须缓存rdd1以避免重复加载?

更一般而言,如果DAG看起来像这样:
python - 执行顺序和缓存需求-LMLPHP
我们是否可以假设两个分支都是并行计算的,并使用rdd1的相同副本?还是Spark驱动程序将一个接一个地计算这些分支,因为这是两个不同的阶段?我知道在执行之前,spark驱动程序将DAG分为阶段和更详细的逻辑部分-tasks。一个阶段内的任务可以并行计算,因为其中没有任何随机阶段,但是像图像中的两个并行分支呢?我知道所有的直觉都属于rdd抽象(惰性评估等),但这并不能使事情更容易理解。请给我任何建议。

最佳答案



是。



否。Spark利用惰性评估来处理数据。这意味着在需要之前不会进行任何计算。除非有明确的声明,否则不会存储任何内容。



确实,您需要缓存rdd1以防止文本文件被读取两次。



这两个分支具有不同的世系,因此不会并行处理。通常,在采取任何措施之前不会处理任何数据。每当需要结果(读取结果,需要执行操作)时,将进行给定谱系中所有进行中的转换和当前操作的数据处理。之后,除非调用cache,否则内存中将不存在任何数据。

有关转换与操作的说明,请参见deck

10-06 11:13