执行顺序和缓存需求
Posted
技术标签:
【中文标题】执行顺序和缓存需求【英文标题】:Order of execution and need of caching 【发布时间】:2018-05-07 17:12:22 【问题描述】:让我们考虑这样一个 python 伪代码的 sn-p,使用 spark。
rdd1 = sc.textFile("...")
rdd2 = rdd1.map().groupBy().filter()
importantValue = rdd2.count()
rdd3 = rdd1.map(lambda x : x / importantValue)
在spark的tasks的DAG
中,有两个分支,在创建rdd1
之后。两个分支都使用rdd1
,但第二个分支(计算rdd3
)也使用来自rdd2
(importantValue
)的聚合值。我假设DAG
看起来像这样:
我对吗?如果是,我们是否可以假设用于计算rdd3
的rdd1
仍在内存中处理?或者我们必须缓存rdd1
以防止重复加载?
更一般地说,如果DAG
看起来像这样:
我们可以假设两个分支都是并行计算的并使用rdd1
的相同副本吗?还是 Spark 驱动程序会一个接一个地计算这些分支,因为这是两个不同的阶段?我知道在执行之前 spark 驱动程序将 DAG
拆分为多个阶段和更详细的逻辑部分 - tasks
。一个阶段内的任务可以并行计算,因为内部没有洗牌阶段,但是图像中的两个并行分支呢?我知道所有关于 rdd 抽象的直觉(惰性评估等),但这并没有让我更容易理解。请给我任何建议。
【问题讨论】:
【参考方案1】:我假设 DAG 看起来像这样:我说的对吗?
是的。
如果是,我们是否可以假设计算 rdd3 时使用的 rdd1 仍然在内存中处理?
没有。 Spark 利用惰性求值来处理数据。这意味着在需要之前不会计算任何内容。除非有明确的声明,否则不会存储任何内容。
或者我们必须缓存 rdd1 以防止重复加载?
没错,你需要缓存 rdd1 以防止文本文件被读取两次。
更一般地说,如果 DAG 看起来像这样:我们是否可以假设两个分支都是并行计算的并使用相同的 rdd1 副本?还是 Spark 驱动程序会一个接一个地计算这些分支,因为这是两个不同的阶段?
这两个分支不会被并行处理,因为它们有不同的谱系。通常,在采取行动之前不会处理任何数据。每当需要一个结果(读取,调用一个动作)时,所有正在进行的转换和给定沿袭中的当前动作的数据处理都会发生。之后,除非调用cache
,否则内存中将不存在任何数据。
请参阅此 deck 了解转换与操作的说明
【讨论】:
【参考方案2】:我们可以假设用于计算 rdd3 的 rdd1 仍然在内存中处理吗?或者我们必须缓存 rdd1 以防止重复加载?
rdd1
未缓存。要缓存它,您需要显式缓存它,并确保.cache()
返回的RDD存储在用于创建rdd2
的变量中:
rdd1 = sc.textFile("...").cache()
rdd2 = rdd1.map().groupBy().filter()
如果要将其添加到您的图表中,rdd1
和 rdd2
之间将有另一个 RDD。
我们可以假设两个分支都是并行计算的并使用相同的 rdd1 副本吗?还是 Spark 驱动程序会一个接一个地计算这些分支,因为这是两个不同的阶段?
决定作业是否并行运行的不是(分支)沿袭,而是作业请求本身。假设你跑了:
rdd4.count()
rdd5.count()
这将执行rdd1
->rdd2
->rdd4
然后计数,然后 rdd1
->rdd3
->rdd5
。此计算将是顺序的。
要并行运行这两个图,必须并行提交作业(异步调用)。有很多问题可以解决这个话题。检查this 和this。
【讨论】:
感谢重播。多看几个问题会很好吗? 1. 您认为将 RDD 更多地视为达到结果的方法而不是数据结构是一种很好的直觉吗? 2.rdd1
和rdd2
之间的另一个RDD是指cached-rdd1
? 3. 如果我们的集群中有大量内存并且在计算rdd1
->rdd2
->rdd4
之后,rdd1
仍然在内存中怎么办。我的意思是它没有消失或被其他数据覆盖。 spark 是利用这种情况还是 spark 只是检查某种标志 isCached
并仅根据该信息执行,即使数据可用。
@Michocio 1. 我认为这是看待它的好方法。它符合模型中使用的函数式风格,并且与声明性方法相得益彰(它更像是“我想要 a,我想要 b,......”而不是“像这样做 a,然后像那样做 b”)。 2. 正确 3. 您需要明确地缓存/持久化 RDD,我认为这是一个很好的设计决策(创建了太多的 rdd,大多数是在内部)。查看spark.apache.org/docs/latest/… 获取有关 rdd 缓存的信息。以上是关于执行顺序和缓存需求的主要内容,如果未能解决你的问题,请参考以下文章