【问题标题】:Explain RDD recomputation解释 RDD 重新计算
【发布时间】:2017-08-07 15:51:53
【问题描述】:

我正在阅读有关 spark 的信息并遇到以下声明。

最后,默认情况下,Spark 的 RDD 会在您每次运行时重新计算 对他们采取行动。如果您想在多个操作中重用一个 RDD, 您可以使用 RDD.persist() 让 Spark 持久化它

我想详细了解,重新计算的含义是什么。例如,我在下面写了代码 sn-p。我想也许如果我在代码休眠时在文本文件中(通过终端)添加 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();

    }

}

【问题讨论】:

  • 你确定计数是一样的吗?我在 Spark-Shell 中尝试过,在两次调用“textLoadRDD.count()”之间更改我的文件会产生不同的结果
  • 嗨@Lordofdark我已经更新了system.out.println结果的问题。

标签: apache-spark


【解决方案1】:

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

我认为this blog 的这张图片很好地解释了它:

如果您不缓存/保留任何内容,那么每次您需要输出时(当您调用诸如“计数”之类的操作时)都会从磁盘读取数据并完成操作。您可以在读取后缓存(例如),然后所有其他操作将跳过读取并从缓存的数据开始。

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

【讨论】:

    【解决方案2】:

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

    由于我在本地机器上执行程序,添加记录时可能会出现一些问题,如果我在覆盖高级主题时无法弄清楚,将更新此问题。不过目前假设已经得到证实。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 2018-03-17
      • 2015-05-13
      • 1970-01-01
      相关资源
      最近更新 更多