如何在Apache Spark中的RDD中传递沿袭

时间:2015-06-07 23:33:06

标签: apache-spark rdd

每个RDD指向同一个谱系图

当父RDD将其谱系赋予新RDD时,子谱图也是由子项复制的,因此父项和子项都有不同的图形。在这种情况下,它不是内存密集型的吗?

2 个答案:

答案 0 :(得分:7)

每个RDD都维护一个指向一个或多个父级的指针以及有关它与父级的关系类型的元数据。例如,当我们在RDD上调用val b = a.map()时, RDD b只保留一个引用(并且从不复制)到它的父a,这是一个沿袭< /强>

当驱动程序提交作业时,RDD图被序列化到工作节点,以便每个工作节点在不同的分区上应用一系列转换(如映射过滤器等)。此外,如果发生某些故障,此RDD沿袭将用于重新计算数据。

为了显示RDD的谱系,Spark提供了一种调试方法toDebugString()方法。

考虑以下示例,

val input = sc.textFile("log.txt")
val splitedLines = input.map(line => line.split(" "))
                    .map(words => (words(0), 1))
                    .reduceByKey{(a,b) => a + b}

toDebugString() RDD上执行splitedLines,将输出以下内容,

(2) ShuffledRDD[6] at reduceByKey at <console>:25 []
    +-(2) MapPartitionsRDD[5] at map at <console>:24 []
    |  MapPartitionsRDD[4] at map at <console>:23 []
    |  log.txt MapPartitionsRDD[1] at textFile at <console>:21 []
    |  log.txt HadoopRDD[0] at textFile at <console>:21 []

有关Spark如何在内部工作的更多信息,请阅读我的另一个post

答案 1 :(得分:0)

当调用转换(映射或过滤器等)时,它不会立即由Spark执行,而是为每个转换创建一个谱系。 血统将跟踪必须在该RDD上应用的所有变换, 包括从中读取数据的位置。

例如,请考虑以下示例

val myRdd = sc.textFile("spam.txt")
val filteredRdd = myRdd.filter(line => line.contains("wonder"))
filteredRdd.count()

sc.textFile()和myRdd.filter()不会立即执行, 只有在RDD上调用Action时才会执行它 - 这里是filteredRdd.count()。

动作用于将结果保存到某个位置或显示它。 也可以使用命令filteredRdd.toDebugString打印RDD沿袭信息(filteredRdd是此处的RDD)。 此外,DAG Visualization以非常直观的方式显示完整的图形,如下所示:

enter image description here