我最近在spark工作,遇到了一些我仍然无法解决的问题。
假设我有一个100gb的数据集,集群的ram大小是16GB。
现在,我知道,只要读取文件并将其保存在hdfs中,spark就可以为每个分区执行该操作。当我对100gb数据执行排序或聚合转换时会发生什么?它将如何处理100gb的内存,因为我们需要整个数据的情况下排序?
我已经浏览了下面的链接,但这只告诉我们spark在持久化的情况下会做什么,我正在寻找的是spark聚合或对大于ram大小的数据集进行排序。
spark rdd-分区总是在ram中吗?
感谢您的帮助。
2条答案
按热度按时间bwitn5fc1#
有两件事你可能想知道。
一旦spark达到内存限制,它就会开始将数据溢出到磁盘。请检查这个Spark常见问题,也有几个问题,所以谈论相同的,例如,这一个。
有一个名为externalsort的algorihtm,允许您对内存中不适合的数据集进行排序。从本质上讲,您将大数据集划分为实际适合内存的块,对每个块进行排序,然后将每个块写入磁盘。最后,合并每个排序的块,以便对整个数据集进行排序。spark支持外部排序,这是实现。
回答您的问题时,您并不需要将数据放入内存来对其进行排序,正如我之前向您解释的那样。现在,我鼓励您考虑一种数据聚合算法,将数据划分为块,就像外部排序一样。
7gs2gvoe2#
你需要考虑的事情有很多。因为您有16ram和100gb的数据集,所以最好在磁盘中保持持久性。如果数据集具有较高的基数,则可能很难进行聚合。如果基数较低,最好在合并到整个数据集中之前对每个rdd进行聚合。还要记住确保rdd中的每个分区都小于内存(默认值0.4*容器大小)