【发布时间】:2020-07-14 17:24:21
【问题描述】:
假设我的Spark集群有100G内存,在Spark计算过程中,会产生更多200G大小的数据(新数据帧、缓存)。在这种情况下,Spark 会将这些数据中的一部分存储在磁盘上还是只存储OOM?
【问题讨论】:
标签: apache-spark
假设我的Spark集群有100G内存,在Spark计算过程中,会产生更多200G大小的数据(新数据帧、缓存)。在这种情况下,Spark 会将这些数据中的一部分存储在磁盘上还是只存储OOM?
【问题讨论】:
标签: apache-spark
Spark 仅在调用操作(如 count, collect or write)时才开始读取数据。一旦调用了一个动作,Spark 就会在分区中加载数据 - 并发加载的分区数取决于您可用的内核数。所以在 Spark 中你可以想到1 partition = 1 core = 1 task。
如果您不应用任何转换,而只应用 count,Spark 仍会读取分区中的数据,但它不会在您的集群中存储任何数据,如果您再次执行 count,它将读取再次在所有数据中。为了避免多次读取数据,您可以调用cache 或persist 在这种情况下,Spark 将尝试将数据存储在您的集群中。在缓存上(与persist(StorageLevel.MEMORY_ONLY)相同,它将所有分区存储在内存中 - 如果它不适合内存,您将获得OOM。如果您调用persist(StorageLevel.MEMORY_AND_DISK),它将存储尽可能多的因为它可以在内存中,其余的将放在磁盘上。如果数据不适合磁盘,操作系统通常会杀死你的工人。
在 Apache Spark 中,如果数据不适合内存,Spark 只会将该数据保存到磁盘。如果数据不适合内存,Spark 的操作员会将数据溢出到磁盘,从而使其能够在任何大小的数据上运行良好。同样,不适合内存的缓存数据集要么溢出到磁盘,要么在需要时动态重新计算,这取决于 RDD 的存储级别。 Apache Spark 中的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.
OFF_HEAP 存储正在试验中。
【讨论】: