Spark中的“RDD可以存储在内存中”是啥意思?
Posted
技术标签:
【中文标题】Spark中的“RDD可以存储在内存中”是啥意思?【英文标题】:What does "RDDs can be stored in memory" mean in Spark?Spark中的“RDD可以存储在内存中”是什么意思? 【发布时间】:2014-09-10 08:01:14 【问题描述】:在介绍 Spark 时,它说
RDDs can be stored in memory between queries without requiring replication.
据我所知,您必须使用 .cache()
或 .persist()
手动缓存 RDD。如果我不采取任何措施,如下所示
val file = sc.textFile("hdfs://data/kv1.txt")
file.flatMap(line => line.split(" "))
file.count()
我没有将RDD“文件”保存在缓存或磁盘中,在这种情况下,Spark 可以运行得更快 比 MapReduce?
【问题讨论】:
如果我们有一个具有 n GB RAM 的 Spark 集群,并且上例中的文件 kv1.txt 是几个 PB。 Spark 可以在不调用 persist() 的情况下处理它吗? 【参考方案1】:Spark 会逐个分区地计算每个阶段的计算。它会在内存中临时保存一些数据来完成它的工作。它可能必须将数据溢出到磁盘并通过网络传输以执行某些阶段。但这一切都不是(必然)持久的。如果您再次count()
,它将从头开始。
这不是 Spark 比 MapReduce 运行得更快的情况;对于像这样的简单操作,它可能会更慢。事实上,加载到内存中并没有什么好处。
更复杂的示例,例如重要的管道或对 RDD 的重复访问,将显示持久化内存甚至磁盘的好处。
【讨论】:
tks @Sean。您提到Spark“将在内存中临时保存一些数据以完成其工作”。因此,当“临时数据”足够大时,内存可能会溢出。我该如何决定内存是否能够满足原始数据的需求? 不,不是。我指的是您的函数分配的任何内存,而不是数据消耗的内存。当然,总是有可能通过分配一堆内存来使任何程序耗尽内存。我不确定你在问什么是 Spark 特有的。【参考方案2】:是的,毫无疑问,它会比 MapReduce 运行得更快。 Spark 像在内存中一样处理所有 RDD,每次在其上运行操作时,可能会重新计算每个转换后的 RDD。但是,您也可以使用持久(或缓存)方法将 RDD 持久化在内存中,在这种情况下,Spark 会将元素保留在集群上,以便下次查询时更快地访问它。还支持在磁盘上持久化 RDD,或跨多个节点复制。
http://spark.apache.org/docs/latest/programming-guide.html
“这在重复访问数据时非常有用,例如查询小的“热”数据集或运行像 PageRank 这样的迭代算法时”
您的问题的答案:“在 Spark 中,“RDD 可以存储在内存中”是什么意思?我们是否可以使用 .cache() 在 RAM 中存储一个 RDD 而无需重新计算(当我们对其应用操作时)。
【讨论】:
在本例中,两者的“内存”处理程度相同。这不是 Spark 更快的情况。 tks @Devan.我明白了。但是由于Spark在内存中处理所有RDDS,如果我们要处理TBs甚至PBs数据,集群的内存必须是巨大的! Spark 并没有一次取整个 RDD,你可以查看日志,spark 将文件拆分成块并进行处理。 @DevanMuthunayakanSreemandira MapReduce 也是如此。这没有区别。 任何执行 shuffle/reduce 的操作都会自然地溢出到 Hadoop 中的磁盘。如果可以避免这种情况,计算必然会更快以上是关于Spark中的“RDD可以存储在内存中”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
Apache Spark Web UI 中的“Stage Skipped”是啥意思?