python - 执行顺序和缓存需求

标签 python apache-spark hadoop pyspark bigdata

让我们考虑一下使用 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 看起来像这样: enter image description here 我对吗?如果是,我们是否可以假设用于计算 rdd3 的 rdd1 仍然在内存中处理?或者我们必须缓存 rdd1 以防止重复加载?

更一般地说,如果DAG看起来像这样: enter image description here 我们可以假设两个分支都是并行计算并使用 rdd1 的相同副本吗?或者 Spark 驱动程序将逐个计算这些分支,因为这是两个不同的阶段?我知道在执行之前 Spark 驱动程序会将 DAG 分成阶段和更详细的逻辑部分 - 任务。一个阶段内的任务可以并行计算,因为其中没有洗牌阶段,但是如图所示的两个并行分支又如何呢?我知道 rdd 抽象(惰性求值等)背后的所有直觉,但这并不会让我更容易理解。请给我任何建议。

最佳答案

I assume that DAG looks something like this: Am I right?

是的。

If yes, can we assume that rdd1 used in computing rdd3 is still handled in memory?

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

Or we have to cache rdd1 in order to prevent repeated loading of that?

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

More generally, if DAG looks like this: can we assume that both branches are computed pararelly and use the same copy of rdd1? Or Spark driver will compute these branches one after another, because these are two different stages?

这两个分支不会并行处理,因为它们具有不同的谱系。一般来说,在采取行动之前不会处理任何数据。每当需要结果(读取、调用操作)时,就会发生给定谱系中所有正在进行的转换和当前操作的数据处理。之后,除非调用cache,否则内存中将不再存在任何数据。

查看此deck有关转换与操作的解释

关于python - 执行顺序和缓存需求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50219311/

相关文章:

hadoop - TEZ的Hive索引

java - 将多个特定文件作为来自另一个 java 程序的一个字符串 arg 传递

python - WxTimer 不让 wxFrame 关闭

python - 特征具有固定系数的多元线性回归

Python PyQt4 信号未触发连接方法

hadoop - 在hadoop中解析Spark驱动程序主机时出现错误

Hadoop reducer 清理函数

python - 如何在 Django 模板中放置链接

scala - 如何使用 scala/spark 正确迭代/打印 Parquet ?

python - 在 Pyspark 中使用 Hadoop InputFormat