Spark RDD Lineage and Storage

时间:2016-03-30 05:20:02

标签: hadoop apache-spark rdd

inputRDD = sc.textFile("log.txt")
errorsRDD = inputRDD.filter(lambda x: "error" in x) 
warningsRDD = inputRDD.filter(lambda x: "warning" in x) 
badLinesRDD = errorsRDD.union(warningsRDD)
badLinesCount = badLinesRDD.count()
warningCount = warningsRDD.count()

在上面的代码中,在执行badLinesRDD中的对象数量之前执行第二行到最后一行代码时,不会评估任何转换。因此,当运行此badLinesRDD.count()时,它将计算前四个RDD直到联合并返回结果。但是当warningsRDD.count()运行时,它只计算转换RDD直到前三行,并返回正确的结果?

当在对它们调用动作时计算这些RDD转换时,哪个是最后一个RDD转换的对象,哪个是union,存储?它是否存储在并行运行过滤器转换的每个DataNode的内存中?

1 个答案:

答案 0 :(得分:3)

除非任务输出显式保持(例如cachepersist)或隐式(随机写入),并且有足够的可用空间,每个操作都将执行完整的沿袭。

因此,当您致电warningsRDD.count()时,它会加载文件(sc.textFile("log.txt"))并过滤(inputRDD.filter(lambda x: "warning" in x))。

  

当在对它们调用动作时计算这些RDD转换时,哪个是最后一个RDD转换的对象,哪个是union,存储?

假设数据没有持久存在,无处可去。数据传递到下一个阶段或输出后,将丢弃所有任务输出。如果数据持久存在,则取决于设置(磁盘,堆上,堆外,DFS)。