持久化后看不到 Spark RDD

Posted

技术标签:

【中文标题】持久化后看不到 Spark RDD【英文标题】:Do not see Spark RDDs after persist 【发布时间】:2016-01-16 13:31:45 【问题描述】:

我使用的是 Spark 1.2.0,并且没有显式配置 SPARK_LOCAL_DIRS,因此假设持久化的 RDD 会转到 /tmp。我正在尝试使用以下代码持久化和 RDD:

    val inputRDD=sc.parallelize(List(1,2,3,3,4,5,6,7,8,9,19,22,21,25,34,56,4,32,56,70))
    val result = inputRDD.map(x=>x*x)
    println("Result count is: "+result.count())
    result.persist(StorageLevel.DISK_ONLY)
    println(result.collect().mkString(",,"))
    println("Result count is: "+result.count()) 

我在我的 RDD 之前和之后强制一个 count() 来确定,但我仍然没有在 /tmp 中看到任何新文件或目录。当我运行我的代码时,唯一改变的目录是 hsperfdata.... 我知道它是用于 JVM 性能数据的。

我的持久化 RDD 去哪儿了?

【问题讨论】:

你的集群配置是什么? 我自己没有配置集群。使用 IntelliJ for Scala 并且刚刚将 Spark 库链接到我的项目。我还在学习所以还没有开始配置 spark-env.sh 文件。 开始阅读官方文档!我相信你缺少一些基本的概念理解。 【参考方案1】:

来自scaladoc of RDD.persist()

设置此 RDD 的存储级别以在第一次计算后跨操作保留其值。如果 RDD 还没有设置存储级别,这只能用于分配新的存储级别。本地检查点是一个例外。

所以您已经在result.persist() 上方的行中调用了result.count(),此时Spark 已经将results 持久性设置为默认值。删除 count 操作并重试。

【讨论】:

我发现了问题。由于我使用的是 IDE,因此我的 SparkContext 在程序结束时被销毁,并用它清理所有数据。在我尝试在命令行上坚持之后(保持上下文活跃,我可以看到 RDD) 我不认为持久化的 RDD 会持续运行你的程序,在 REPL 中这是有道理的,但在 IDE 中运行 Scala 是有道理的,当程序完成时它就消失了。检查日志,您可能会看到最后是否清理。您需要导出一个文本文件(或 HDFS 等)。

以上是关于持久化后看不到 Spark RDD的主要内容,如果未能解决你的问题,请参考以下文章

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

RDD缓存

Spark会把数据都载入到内存么?

Spark- RDD持久化

spark调优:RDD重构和持久化

Spark(13)——cache和chickpoint的区别