【问题标题】:Spark dataset exceeds total ram sizeSpark 数据集超过总内存大小
【发布时间】:2018-09-27 22:56:30
【问题描述】:

我最近在 spark 中工作,遇到了一些我仍然无法解决的问题。

假设我有一个 100GB 的数据集,我的集群内存大小是 16 GB。

现在,我知道如果只是读取文件并将其保存在 HDFS 中,Spark 会为每个分区执行此操作。当我对 100GB 数据进行排序或聚合转换时会发生什么?由于我们需要整个数据以进行排序,它将如何处理 100GB 的内存?

我已经浏览了下面的链接,但这只会告诉我们 spark 在持久化的情况下会做什么,我正在寻找的是 Spark 聚合或对大于 ram 大小的数据集进行排序。

Spark RDD - is partition(s) always in RAM?

感谢任何帮助。

【问题讨论】:

  • Spark 在内存用完时将内容溢出到磁盘(嗯,您可以更改默认配置...)。您可以在 UI 的“存储”选项卡中查看此信息。

标签: apache-spark hadoop hdfs


【解决方案1】:

您可能想知道两件事。

  1. 一旦 Spark 达到内存限制,它将开始将数据溢出到 磁盘。请检查这个 Spark faq 还有几个 来自 SO 的问题谈论相同,例如,this one
  2. 有一个名为external sort 的算法允许您对不适合内存的数据集进行排序。本质上,您将大型数据集划分为实际适合内存的块,对每个块进行排序并将每个块写入磁盘。最后,合并每个已排序的块,以便对整个数据集进行排序。 Spark 支持外部排序,您可以看到herehere 是实现。

正如我之前向您解释的那样,回答您的问题时,您实际上并不需要您的数据适合内存才能对其进行排序。现在,我鼓励您考虑一种数据聚合算法,将数据按块划分,就像外部排序一样。

【讨论】:

  • 我会在某个时候详细研究外部排序,但在此之前,假设数据集不适合内存。 spark会将其溢出到磁盘中,但它将如何跟踪该分区的{key,values},这是聚合或排序进一步需要的。
  • @salmanbw 您不需要跟踪任何内容。对于聚合,Spark 将在后台使用combineByKey(),它实际上使用了 MapReduce 中的 combiner 功能。请检查这个问题:stackoverflow.com/questions/24804619/….
【解决方案2】:

您需要考虑很多事情。因为您有 16RAM 和 100GB 数据集,所以将持久性保留在 DISK 中是个好主意。如果数据集具有高基数,则在聚合时可能会很困难。如果基数较低,则最好在合并到整个数据集之前对每个 RDD 进行聚合。还要记得确保RDD中的每个分区都小于内存(默认值0.4*container_size)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2011-10-17
    • 2019-12-25
    • 1970-01-01
    • 2017-07-26
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多