如果我只有 1 个内存为 25 GB 的执行器,并且它一次只能运行一个任务,那么是否可以处理(转换和操作)1 TB 数据(如果是),那么它将如何读取以及中间数据将存储在哪里?
同样对于相同的场景,如果 hadoop 文件有 300 个输入拆分,那么 RDD 中将有 300 个分区,那么在这种情况下这些分区将在哪里?
它会仅保留在 hadoop 磁盘上并且我的单个任务将运行 300 次吗?
我在 hortonworks 网站上找到了一个很好的答案。
与流行的观点相反,Spark 不仅仅存在于内存中
a) 简单读取,无随机播放(无连接,...)
对于初始读取,Spark 像 MapReduce 一样读取流中的数据并在数据出现时对其进行处理。 IE。除非有原因 Spark 不会在内存中实现完整的 RDD(你可以告诉他这样做,但是如果你想缓存一个小数据集)RDD 是有弹性的,因为 Spark 知道如何重新创建它(从 hdfs 重新读取一个块)例如)不是因为它存储在不同位置的内存中。 (不过这也可以做到。)
因此,如果您过滤掉大部分数据或进行在地图端聚合的有效聚合,您将永远不会在内存中拥有完整的表。
b) 随机播放
这与 MapReduce 非常相似,因为它将映射输出写入磁盘并通过 http 使用化简器读取它们。然而,spark 在 Linux 文件系统上使用了积极的文件系统缓冲区策略,因此如果操作系统有可用内存,数据将不会实际写入物理磁盘。
c) 随机播放后
shuffle后的RDD通常由引擎缓存(否则失败的节点或RDD将需要完全重新运行作业),但是正如abdelkrim提到的那样,Spark可以将这些溢出到磁盘上,除非您否决这一点。
d) 火花流
这有点不同。 Spark Streaming 期望所有数据都适合内存,除非您覆盖设置。
这是原始页面。
Matei Zaharia 最初的 Spark 设计论文也有帮助。(第 2.6.4 节内存不足时的行为)
希望有什么有用的东西。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)