Spark缓存RDD而不被要求

Posted

技术标签:

【中文标题】Spark缓存RDD而不被要求【英文标题】:Spark caching RDD without being asked to 【发布时间】:2015-06-28 08:49:14 【问题描述】:

根据 Spark 文档,如果我们不“缓存”给定的 RDD,那么每次我们引用它时,都会评估 RDD 背后的业务逻辑(图表)。但实际上,当我使用 Spark shell 尝试此操作时,我发现即使我们没有显式缓存,仍然使用“内存中”副本。当我们不要求时,为什么 Spark 会缓存 RDD?我在 Windows 上使用 Spark 的独立模式,与此有关吗?

所以让我描述一下我做了什么。我创建了一个简单的文本文件:-

key1,value1
key2,value2
key3,value3

现在我从 Spark 的 Scala shell 创建了一个 RDD:-

val rdd = sc.textFile("sample.txt").map(line => line.split(",")).map(line => (line(0),line(1)))

现在,当我对此 RDD 执行以下操作时,我得到 value1:-

rdd.lookup("key1")

到目前为止一切都很好。现在我打开原始源文件并在其中添加一个条目:-

key4,value4

我保存文件。现在从同一个 shell(我还没有退出 shell),我触发了以下操作:-

rdd.lookup("key4")

它返回空列表,所以基本上它说它没有找到key4的条目。这意味着 Spark 仍在使用它显然保存在内存中的旧副本。否则,如果你说的是对的,它应该从头开始评估 RDD 的完整业务逻辑,在这种情况下它会获取 key4,value4。但它完全不知道文件中的这一新行。为什么会这样?我显然还没有缓存 RDD,它仍然指的是旧版本的文件。

谢谢

【问题讨论】:

你用的是什么版本的 Spark? 呃,奇怪!您是否尝试过使用本地文件或 HDFS?我无法在本地磁盘上使用 1.4.0 进行复制。如果可以的话,我建议你查看作业的 Spark UI 上的 DAG 可视化。它应该告诉你它是否认为它正在重新读取文件。 我只使用本地文件。事实上,我已经在我的 Windows 笔记本电脑上安装了这个。让我按照您的建议尝试检查 UI。 我尝试在 spark UI 上检查 DAG 可视化以完成这项工作,即 rdd.lookup("key4"),它显示它正在从文件中读取。但是结果仍然是,即使在创建RDD之后添加到文件中,它也无法获取key4,value4。我注意到的另一件有趣的事情是,即使我缓存某些 RDD 并在 shell 中连续两次对其调用某些“动作”,最新作业的 DAG 可视化仍然显示它正在从源文件中读取。这是否意味着“缓存”在本地不起作用? 也许这意味着我只是误解了可视化:)。抱歉,我目前无法深入研究。作为一种解决方法,我想您总是可以从头开始使用新的 RDD。如果没有缓存,我认为重用一个 RDD 不会带来性能优势。 【参考方案1】:

我可以使用 Apache Spark 1.3.0 重现此行为。我也想用 1.4.0 重现它,因为它可以很好地了解阶段中发生的转换。但在 Spark 1.4.0 rdd.lookup("key4") 中有效!

我认为这意味着该行为是由错误引起的。我找不到错误编号。

【讨论】:

【参考方案2】:

您确定您在 hdfs 中编辑并上传了这个新的文本文件吗? 我重复了你的步骤:在 hdfs 上上传文件,计算 rdd,删除旧文件,用新行上传新文件并运行查找操作 - 它返回新结果。

【讨论】:

您使用的是什么 Spark 版本?您是否也尝试过使用本地文件? (我认为 OP 正在尝试使用本地文件。) 1.3.1,独立模式,hdfs 文件系统配置有<name>fs.defaultFS</name> 属性core-site.xml 我在 Windows 上使用带有本地文件系统的 Spark 1.4.0('Spark Standalone' 也由 Spark Shell 启动)。但即使在这种情况下,我相信它的行为也不应该有任何不同。 Spark 不应该在没有我们要求的情况下缓存它。每次我们引用 RDD 时它都应该执行 lineage,除非它被缓存。我没有看到它发生。【参考方案3】:

这不是错误,而是 Spark shell 提供的功能。我能够使用最新的 Spark-1.5.0-SNAPSHOT 看到相同的行为。

Spark 家伙创建 shell 的想法是一些交互式控制台,用于对预加载的数据集进行一些快速计算。 在核心下,它使用 Scala REPL,一旦声明,对象就会保存在 JVM 中。

参见第 4 节(解释器集成)http://www.cs.berkeley.edu/~matei/papers/2010/hotcloud_spark.pdf

【讨论】:

以上是关于Spark缓存RDD而不被要求的主要内容,如果未能解决你的问题,请参考以下文章

Node.JS MySQL 将结果记录到控制台而不被要求和奇怪的行为

3天掌握Spark--RDD 共享变量

RDD的缓存,依赖,spark提交任务流程

Spark框架—RDD分区和缓存

Spark 学习RDD自定义分区和缓存

RDD缓存