内存数据存储在Apache Spark的上下文中意味着什么?

时间:2014-08-15 21:39:09

标签: hadoop apache-spark

我已经读过Apache Spark将数据存储在内存中。但是,Apache Spark旨在分析大量数据(也就是大数据分析)。在这种情况下,内存数据存储真正意味着什么?它可以存储的数据是否受RAM限制?它的数据存储与使用HDFS的Apache Hadoop相比如何?

1 个答案:

答案 0 :(得分:13)

在Hadoop中,数据在步骤之间持久保存到磁盘,因此典型的多步骤作业最终会看起来像这样:

hdfs -> read & map -> persist -> read & reduce -> hdfs -> read & map -> persist -> read and reduce -> hdfs

这是一个出色的设计,当您批量处理符合map-reduce模式的文件时,它的使用非常有意义。但是对于某些工作负载,这可能会非常慢 - 迭代算法尤其会受到负面影响。您已经花时间创建了一些数据结构(例如图表),并且您希望在每个步骤中执行的操作都是更新分数。坚持和从磁盘读取整个图形将减慢您的工作。

Spark使用支持循环数据流的更通用的引擎,尝试以在作业步骤之间保留内存。这意味着,如果您可以创建数据结构和分区策略,您的数据不会在作业的每个步骤之间进行随机播放,您可以有效地更新它,而无需在两个步骤之间进行序列化并将所有内容写入磁盘。这就是为什么Spark在他们的头版上有一张图表,显示逻辑回归的速度提高了100倍。

如果您编写的Spark作业只是计算数据集中每个输入行的值,并将其写回磁盘,那么Hadoop和Spark在性能方面几乎相同(Spark的启动时间更快)但是,当我们花费数小时处理数据时,这几乎不重要。)

如果Spark在步骤之间无法在内存中保存RDD,它会将其溢出到磁盘,就像Hadoop一样。但请记住,Spark不是银弹,并且会有一些极端情况,你必须与Spark内存中的性质作斗争,造成OutOfMemory问题,而Hadoop只会将所有内容写入磁盘。 / p>

我个人喜欢这样想:在您的500个64GB计算机集群中,创建Hadoop以通过分发磁盘读取和写入来更快地批量处理500 TB作业。 Spark利用500 * 64GB = 32TB内存的事实可以完全解决你内存中的其他一些问题!