spark如何处理超过其容量的内存

qc6wkl3g  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(455)

假设我的星火团 100G 内存,在spark计算过程中,更多数据(新的Dataframe、缓存)的大小为 200G 是生成的。在这种情况下,spark会将一些数据存储在磁盘上,还是只是 OOM ?

wfveoks0

wfveoks01#

spark只在一个动作(如 count, collect or write )被称为。一旦调用了一个操作,spark就会加载分区中的数据——并发加载分区的数量取决于可用的内核数量。所以在spark你可以想到 1 partition = 1 core = 1 task .
如果不应用任何转换,而只应用一个示例 count ,spark仍将读取分区中的数据,但它不会在集群中存储任何数据,如果您执行 count 它将再次读取所有数据。为了避免多次读取数据,可以调用 cache 或者 persist 在这种情况下,spark将尝试在集群中存储数据。在缓存上(与persist相同( StorageLevel.MEMORY_ONLY )它会将所有分区存储在内存中-如果它不适合内存,您将得到一个oom。如果你打电话给我( StorageLevel.MEMORY_AND_DISK )它将尽可能多地存储在内存中,其余的将放在磁盘上。如果数据不能放在磁盘上,操作系统通常会杀死你的工人。
在apachespark中,如果数据不适合内存,那么spark只是将数据持久化到磁盘。spark的运营商将数据泄漏到磁盘,如果它不适合内存,允许它在任何大小的数据上运行良好。同样地,不适合内存的缓存数据集要么溢出到磁盘,要么在需要时动态重新计算,这取决于rdd的存储级别。apachespark中的persist方法提供了六个persist存储级别来持久化数据。

MEMORY_ONLY, MEMORY_AND_DISK, MEMORY_ONLY_SER 
(Java and Scala), MEMORY_AND_DISK_SER 
(Java and Scala), DISK_ONLY, MEMORY_ONLY_2, MEMORY_AND_DISK_2, OFF_HEAP.

堆外存储正在实验中。

相关问题