Spark没有被要求

时间:2015-06-28 08:49:14

标签: scala apache-spark

根据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,但它仍指的是旧版本的文件。

由于

2 个答案:

答案 0 :(得分:3)

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

我认为这意味着行为是由一个错误造成的。我找不到错误编号。

答案 1 :(得分:0)

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