我正在阅读关于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();
}
}
答案 0 :(得分:0)
最后,每次对它们执行操作时,Spark的RDD默认都会重新计算。如果您想在多个操作中重用RDD,可以让Spark使用RDD.persist()
来保留它。
我认为this blog的这张照片解释得非常好:
如果您没有缓存/保留任何内容,那么每次需要输出时(当您调用&#34; count&#34;等操作时),都会从磁盘读取数据并完成操作。您可以在读取后缓存(例如),然后每个其他操作都会跳过读取并从缓存的数据开始。
在操作中将缓存视为检查点:当您需要输出时,将再次调用每个操作,直到最后一个缓存的RDD(或数据集)。
答案 1 :(得分:0)
我修改了上面的步骤,现在用新的记录集替换了本地文件而不是添加记录(如上所述)并且它起作用,即它给出了新计数而不是旧计数,这表示每次调用时都会重新计算RDD。
由于我在本地计算机上执行程序,在添加记录时可能会出现一些问题,如果我在覆盖预先主题时无法弄清楚,则会更新此问题。然而,目前的假设已得到证实。