我是 Spark 的新手,我发现文档说 Spark 会将数据加载到内存中以使迭代算法更快。
但是如果我有一个 10GB 的日志文件并且只有 2GB 内存呢?Spark 会像往常一样将日志文件加载到内存中吗?
我是 Spark 的新手,我发现文档说 Spark 会将数据加载到内存中以使迭代算法更快。
但是如果我有一个 10GB 的日志文件并且只有 2GB 内存呢?Spark 会像往常一样将日志文件加载到内存中吗?
我认为这个问题在 Spark 网站( https://spark.apache.org/faq.html )的 FAQ 面板中已经得到了很好的回答:
这里的关键是要注意RDD 被分成多个分区(请参阅此答案末尾的方法),并且每个分区都是一组元素(例如可以是文本行或整数)。分区用于并行化不同计算单元中的计算。
所以关键不是文件是否太大,而是分区是否。在这种情况下,在常见问题解答中:“Spark 的操作员将数据溢出到磁盘,如果它不适合内存,允许它在任何大小的数据上运行良好”。大分区产生OOM的问题在这里得到解决。
现在,即使分区可以放入内存,这样的内存也可能是满的。在这种情况下,它会从内存中驱逐另一个分区以适应新分区。驱逐可能意味着:
内存管理在这里得到了很好的解释:“Spark 将分区存储在内存中的 LRU 缓存中。当缓存达到其大小限制时,它会从其中驱逐条目(即分区)。当分区具有“磁盘”属性时(即您的持久性级别允许将分区存储在磁盘上),它将被写入HDD并释放它所占用的内存,除非您请求它。当您请求它时,它将被读入内存,如果没有足够的内存缓存中的其他一些较旧的条目将被逐出。如果您的分区没有“磁盘”属性,则逐出仅意味着销毁缓存条目而不将其写入硬盘”。
初始文件/数据的分区方式取决于数据的格式和类型,以及用于创建 RDD 的函数,请参阅this。例如:
最后,我建议您阅读本文以获取更多信息,并决定如何选择分区数量(太多或太少?)。
它不会加载完整的 10G,因为您没有足够的可用内存。根据我的经验,根据您使用数据的方式,会发生以下三种情况之一:
如果您尝试缓存 10GB:
如果您只是处理数据:
当然,这与您的代码和您正在应用的转换高度相关。