【发布时间】: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 不会带来性能优势。
标签: scala apache-spark