【问题标题】:how does Spark handle more memory than its capacitySpark 如何处理比其容量更多的内存
【发布时间】:2020-07-14 17:24:21
【问题描述】:

假设我的Spark集群有100G内存,在Spark计算过程中,会产生更多200G大小的数据(新数据帧、缓存)。在这种情况下,Spark 会将这些数据中的一部分存储在磁盘上还是只存储OOM

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    Spark 仅在调用操作(如 count, collect or write)时才开始读取数据。一旦调用了一个动作,Spark 就会在分区中加载数据 - 并发加载的分区数取决于您可用的内核数。所以在 Spark 中你可以想到1 partition = 1 core = 1 task

    如果您不应用任何转换,而只应用 count,Spark 仍会读取分区中的数据,但它不会在您的集群中存储任何数据,如果您再次执行 count,它将读取再次在所有数据中。为了避免多次读取数据,您可以调用cachepersist 在这种情况下,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 存储正在试验中。

    【讨论】:

    • 我认为它仍然会溢出到仅具有持久内存的磁盘。不是吗?
    • 请注意,所有并发加载的分区都必须适合内存,否则您将获得 OOM。措辞不好。
    猜你喜欢
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 2013-08-27
    相关资源
    最近更新 更多