Spark数据集超过了总ram大小

时间:2018-04-17 20:42:27

标签: apache-spark hadoop hdfs

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

  

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

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

我已经通过下面的链接,但这只告诉我们在持续存在的情况下会发生什么样的火花,我看的是Spark聚合或排序大于ram大小的数据集。

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

感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

您可能想知道两件事。

  1. 一旦Spark达到内存限制,它就会开始将数据溢出到 磁盘。请检查此Spar faq,还有几个 从SO谈论同样的问题,例如,this one
  2. 有一个名为external sort的算法允许您对不适合内存的数据集进行排序。实质上,您将大数据集除以实际适合内存的块,对每个块进行排序并将每个块写入磁盘。最后,合并每个已排序的块以便对整个数据集进行排序。 Spark支持外部排序,您可以看到herehere是实现。
  3. 回答你的问题,你真的不需要你的数据适合内存以便对它进行排序,正如我之前向你解释的那样。现在,我建议您考虑一种用于按数据块分割数据的数据聚合算法,就像外部排序一样。

答案 1 :(得分:0)

您需要考虑多种因素。因为你有16RAM和100GB数据集,所以最好在DISK中保持持久性。如果数据集具有高基数,那么聚合可能很困难。如果基数很低,那么在合并到整个数据集之前,最好在每个RDD上进行聚合。还要记住确保RDD中的每个分区都小于内存(默认值0.4 * container_size)