内存计算

1. 目的

本章将为您提供有关内存计算的详细说明和Spark中的各种存储策略。

2. 什么是内存计算

数据保存在随机存取存储器(RAM)中,而不是一些慢速磁盘驱动器中,能够并行处理。

内存计算的两个主要特点是:RAM存储和并行分布式处理。

3. Spark内存计算

将数据保存在内存中可以将性能提高一个数量级。Spark的主要抽象是RDD,Spark使用cache()或persist()方法缓存RDD。当使用cache()方法时,所有的RDD都存储在内存中,那些不能被内存装下的分区将不会被缓存,并且在需要的时候被重新计算。

Spark的内存计算非常适合机器学习和微批处理,它为迭代工作提供更快的执行速度。

当我们使用persist()方法时,RDD也可以存储在内存中,我们可以在后续操作中使用它。 cache()和persist()之间的区别在于使用cache()时存储策略是MEMORY_ONLY,而在使用persist()时我们可以使用各种存储策略。

4. persist()存储策略

MEMORY_ONLY

MEMORY_AND_DISK

MEMORY_ONLY_SER

MEMORY_AND_DISK_SER

DISK_ONLY

MEMORY_ONLY_2 

MEMORY_AND_DISK_2

4.1 MEMORY_ONLY

将RDD作为非序列化的对象存储在JVM中。如果RDD不能被内存装下,一些分区将不会被缓存,并且在需要的时候被重新计算。

4.2 MEMORY_AND_DISK

将RDD作为非序列化的对象存储在JVM中。如果RDD不能被内存装下,超出的分区将被保存在硬盘上,并且在需要时被读取。

4.3 MEMORY_ONLY_SER

将RDD作为序列化的对象存储(每个分区一个byte数组)。这种方式比非序列化方式更节省空间,特别是用到快速的序列化工具时,但是会更耗费CPU资源。

4.4 MEMORY_AND_DISK_SER

和MEMORY_ONLY_SER类似,但不是在每次需要时重复计算这些不适合存储到内存中的分区,而是将这些分区存储到磁盘中。

4.5 DISK_ONLY

仅仅将RDD分区存储到磁盘中。

4.6 MEMORY_ONLY_2 and MEMORY_AND_DISK_2

和上面的存储级别类似,但是复制每个分区到集群的两个节点上。

5. 结论

Apache Hadoop使用户能够以非常低的成本存储和处理海量数据。然而,它依赖持久性存储来提供容错能力,其计算模型使MapReduce不适合低延迟应用和迭代计算,如机器学习和图算法。

Apache Spark通过泛化MapReduce模型解决了这些Hadoop的缺点,提高了性能和易用性。

内存计算
滚动到顶部