假设我的星火团 100G 内存,在spark计算过程中,更多数据(新的Dataframe、缓存)的大小为 200G 是生成的。在这种情况下,spark会将一些数据存储在磁盘上,还是只是 OOM ?
100G
200G
OOM
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存储级别来持久化数据。
count, collect or write
1 partition = 1 core = 1 task
count
cache
persist
StorageLevel.MEMORY_ONLY
StorageLevel.MEMORY_AND_DISK
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.
堆外存储正在实验中。
1条答案
按热度按时间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存储级别来持久化数据。
堆外存储正在实验中。