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

时间:2017-07-07 02:24:19

标签: apache-spark

如果我只有一个内存为25 GB的执行程序,并且它一次只能运行一个任务,则可以处理(转换和操作)1 TB数据,如果是,那么它将如何被读取以及中间数据的位置将是商店?

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

1 个答案:

答案 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流式传输需要所有数据都适合内存。

Here's is the original page.

Matei Zaharia最初的Spark设计论文也有所帮助。 (section 2.6.4 Behavior with Insufficient Memory)

希望有一些有用的东西。