Spark 如何处理大于群集内存的数据



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

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

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

与普遍的看法相反,Spark不仅在内存中

a( 简单读取无随机播放(无连接,...

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

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

b( 随机播放

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

c( 随机播放后

洗牌后的RDD通常由引擎缓存(否则发生故障的节点或RDD将需要完全重新运行作业(,但是正如Abdelkrim提到的,Spark可以将它们溢出到磁盘,除非你推翻它。

d( 火花流

这有点不同。Spark 流式处理要求所有数据都适合内存,除非覆盖设置。

这是原始页面。

Matei Zaharia最初的Spark设计论文也有帮助。(第 2.6.4 节 内存不足的行为(

希望有一些有用的东西。

最新更新