如果我只有一个内存为25 GB的执行程序,并且它一次只能运行一个任务,则可以处理(转换和操作)1 TB数据,如果是,那么它将如何被读取以及中间数据的位置将是商店?
同样对于相同的场景,如果hadoop文件有300个输入拆分,那么在RDD中将有300个分区,所以在这种情况下哪个是那些分区? 它会仅保留在hadoop磁盘上,我的单个任务将运行300次吗?
答案 0 :(得分:4)
我在hortonworks网站上找到了一个很好的答案。
与普遍认为Spark相反,不仅仅是内存
a)简单阅读没有随机播放(没有连接,......)
对于初始读取,像MapReduce一样的Spark读取流中的数据并且>随着它的流程处理它。即除非有一个原因,火花不会实现内存中的完整RDD(你可以告诉他这样做,但是如果你想缓存一个小数据集)RDD是有弹性的,因为spark知道如何重新创建它(从hdfs重新读取一个块)例如)不是因为它存储在不同位置的mem中。 (虽然也可以这样做。)
因此,如果您过滤掉大部分数据或进行在地图方面聚合的有效聚合,那么您将永远不会在内存中拥有完整的表格。
b)随机播放
这与MapReduce非常相似,因为它将地图输出写入光盘并使用reducers通过http读取它们。但是,spark在Linux文件系统上使用了激进的文件系统缓冲策略,因此如果操作系统有可用内存,则数据实际上不会写入物理光盘。
c)Shuffle后
shuffle之后的RDD通常由引擎缓存(否则失败的节点或RDD将需要完全重新运行该作业)但是,abdelkrim提到Spark可以将这些溢出到光盘,除非你否决它。
d)Spark Streaming
这有点不同。除非您覆盖设置,否则Spark流式传输需要所有数据都适合内存。
Matei Zaharia最初的Spark设计论文也有所帮助。 (section 2.6.4 Behavior with Insufficient Memory)
希望有一些有用的东西。