解释RDD重新计算

时间:2017-08-07 15:51:54

标签: apache-spark

我正在阅读关于spark的内容并且发现了以下声明。

  

最后,Spark每次运行时都会重新计算Spark的RDD   对他们的行动。如果您想在多个操作中重用RDD,   你可以让Spark使用RDD.persist()

来保留它

我想详细了解重新计算的含义。例如,我在下面写了代码片段。我想也许如果我在代码处于休眠状态时在文本文件中添加n条记录(通过终端),我将能够在再次计算计数操作时看到新的总计数。然而,即使我添加了3条记录,它也只占了1个额外的记录。 你能帮助我理解上面关于重新计算的内容吗?如果可能的话,为什么我的实验不起作用?

这是输出的样子(我删除了不必要的行):

回显前计数:5

开始睡觉

11 45 225 /Users/user/data/wordCount.txt

睡觉后

回显后数:6

package sparkPractice;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;

public class WordCount {

    public static void main(String[] args) throws IOException, InterruptedException {

        SparkConf conf=new SparkConf().setMaster("local[4]").setAppName("Line Count");

        JavaSparkContext ctx=new JavaSparkContext(conf);
        JavaRDD<String> textLoadRDD = ctx.textFile("/Users/user/data/wordCount.txt");
        System.out.println("Count before echo: "+textLoadRDD.count());
        System.out.println("Starting sleep");
        Thread.sleep(20000);
        Runtime rt = Runtime.getRuntime();
        Process process = rt.exec("wc /Users/user/data/wordCount.txt");
        process.waitFor();
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line=reader.readLine();
        while (line != null) {    
            System.out.println(line);
            line = reader.readLine();
        }
        System.out.println("After sleep");
        System.out.println("Count after echo: "+textLoadRDD.count());
        ctx.close();

    }

}

2 个答案:

答案 0 :(得分:0)

  

最后,每次对它们执行操作时,Spark的RDD默认都会重新计算。如果您想在多个操作中重用RDD,可以让Spark使用RDD.persist()

来保留它。

我认为this blog的这张照片解释得非常好:

enter image description here

如果您没有缓存/保留任何内容,那么每次需要输出时(当您调用&#34; count&#34;等操作时),都会从磁盘读取数据并完成操作。您可以在读取后缓存(例如),然后每个其他操作都会跳过读取并从缓存的数据开始。

在操作中将缓存视为检查点:当您需要输出时,将再次调用每个操作,直到最后一个缓存的RDD(或数据集)。

答案 1 :(得分:0)

我修改了上面的步骤,现在用新的记录集替换了本地文件而不是添加记录(如上所述)并且它起作用,即它给出了新计数而不是旧计数,这表示每次调用时都会重新计算RDD。

由于我在本地计算机上执行程序,在添加记录时可能会出现一些问题,如果我在覆盖预先主题时无法弄清楚,则会更新此问题。然而,目前的假设已得到证实。