【问题标题】:What will spark do if I don't have enough memory?如果我没有足够的内存,spark 会做什么?
【发布时间】:2013-12-16 14:07:59
【问题描述】:

我是 Spark 的新手,我发现文档说 Spark 会将数据加载到内存中以加快迭代算法。

但是如果我有一个 10GB 的日志文件并且只有 2GB 内存怎么办? Spark 会像往常一样将日志文件加载到内存中吗?

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    我认为这个问题已经在 Spark 网站的 FAQ 面板中得到了很好的回答(https://spark.apache.org/faq.html):

    • 如果我的数据集不适合内存怎么办? 通常每个数据分区都很小,并且确实适合内存,并且这些分区一次处理几个。对于无法放入内存的超大分区,Spark 的内置运算符对数据集执行外部操作。
    • 当缓存的数据集不适合内存时会发生什么? Spark 可以将其溢出到磁盘或在每次请求时重新计算不适合 RAM 的分区。默认情况下,它使用重新计算,但您可以将数据集的存储级别设置为 MEMORY_AND_DISK 以避免这种情况。

    【讨论】:

      【解决方案2】:

      这里的关键是注意 RDD 在partitions 中拆分(请参阅此答案末尾的方法),并且每个分区都是一组元素(可以是文本行或整数实例)。分区用于并行化不同计算单元中的计算。

      所以关键不是文件是否太大,而是分区是否。在这种情况下,在FAQ 中:“Spark 的操作员将数据溢出到磁盘,如果它不适合内存,允许它在任何大小的数据上运行良好”。大分区产生OOM的问题已解决here

      现在,即使分区可以放入内存,这样的内存也可能是满的。在这种情况下,它从内存中逐出另一个分区以适应新分区。逐出可能意味着:

      1. 完全删除分区:在这种情况下,如果再次需要分区,则重新计算
      2. 分区保留在指定的存储级别。每个 RDD 都可以使用this 存储级别“标记”为缓存/持久化,请参阅this 了解如何操作。

      内存管理很好解释here“Spark 将分区存储在内存中的 LRU 缓存中。当缓存达到其大小限制时,它会从中驱逐条目(即分区)。当分区有“磁盘”属性(即您的持久性级别允许将分区存储在磁盘上),它将被写入HDD并释放它所占用的内存,除非您请求它。当您请求它时,它将被读入内存,并且如果没有足够的内存,缓存中的旧条目将被逐出。如果您的分区没有“磁盘”属性,则逐出只是意味着销毁缓存条目而不将其写入硬盘”

      初始文件/数据的分区方式取决于数据的格式和类型,以及用于创建 RDD 的函数,请参阅this。例如:

      • 如果您已经有一个集合(例如 java 中的一个列表),您可以使用 parallelize() 并指定分区数。集合中的元素将按分区分组。
      • 如果在 HDFS 中使用外部文件:“Spark 为文件的每个块创建一个分区(HDFS 中的块默认为 128MB)”
      • 如果从本地文本文件读取,每一行(以新行“\n”结尾,结束字符可以更改,参见this)是一个元素,多行形成一个分区。

      最后,我建议您阅读this 了解更多信息,并决定如何选择分区数量(太多或太少?)。

      【讨论】:

        【解决方案3】:

        它不会加载完整的 10G,因为您没有足够的可用内存。根据我的经验,根据您使用数据的方式,会发生以下三种情况之一:

        如果您尝试缓存 10GB:

        1. 您将获得 OOME
        2. 即将加载数据

        如果您只是处理数据:

        1. 数据将被换入/换出内存

        当然,这与您的代码和您正在应用的转换高度相关。

        【讨论】:

        • 如果您的数据集有足够的分区,即使所有分区都不能容纳在内存中,那么调用 cache() 应该会导致部分分区被缓存,而其余部分将被重新计算从沿袭(或从磁盘读取,如果您将 RDD 保存在 MEMORY_AND_DISK storage level)。我认为 Spark 的缓存策略足够聪明,不会为了缓存来自同一个 RDD 的新块而驱逐 RDD 的块。
        猜你喜欢
        • 2019-11-18
        • 2014-04-24
        • 2011-02-09
        • 1970-01-01
        • 2011-04-10
        • 2011-07-01
        • 2023-03-19
        • 2017-05-24
        • 1970-01-01
        相关资源
        最近更新 更多