2017-07-07 167 views
1

如果我只有一个内存为25 GB的执行程序,并且它一次只能运行一个任务,那么是否有可能处理(转换和操作)1 TB数据它将被读取并且中间数据将被存储在哪里?Spark如何处理大于群集内存的数据

同样的情况下,如果hadoop文件有300输入拆分,那么RDD中将有300个分区,所以在这种情况下,这些分区将是什么? 它只会保留在hadoop磁盘上,我的单​​个任务将运行300次?

回答

1

我在hortonworks网站上找到了一个很好的答案。

与普遍认为Spark是不是内存仅

一)简单的读无洗牌(无连接,...)

对于初始读起来像MapReduce的Spark在读取数据一个流,并>它处理它。即除非有理由,spark不会实现内存中的完整RDD(如果你想缓存一个小数据集,你可以告诉他这样做)。RDD是有弹性的,因为spark知道如何重新创建它(从hdfs重新读取块例如)不是因为它存储在不同位置的mem中。 (虽然也可以这样做)。

因此,如果您过滤掉大部分数据或者在地图上进行聚合的高效聚合,则永远不会在内存中拥有完整的表。

b)中随机播放

这样做是非常相似的MapReduce因为它写入映射输出到光盘,并与通过http各减速读取它们。然而,Spark在Linux文件系统上使用了积极的文件系统缓冲策略,因此如果操作系统具有可用内存,数据将不会实际写入物理磁盘。

C)洗牌后洗牌后

RDDS通常由发动机缓存(否则失败节点或RDD将需要工作的完整的重新运行),然而作为的Abdelkrim提到星火可波及这些到光盘上,除非你推翻这一点。

d)Spark Streaming

这有点不同。除非您覆盖设置,否则Spark流预期所有数据都适合内存。

Here's is the original page.

而由马·萨里亚最初的Spark的设计论文也有帮助。 (section 2.6.4 Behavior with Insufficient Memory)

希望有一些有用的东西。

+0

当你说在磁盘上存储,它是工作机磁盘还是hdfs? – Rahul

+0

我认为它是工人机器磁盘,就像mapreduce。 – neilron