如果我没有足够的记忆,会有什么火花?

 捕鱼达人2502856571 发布于 2023-02-13 17:25

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

但是,如果我有一个10GB的日志文件并且只有2GB的内存呢?Spark会一如既往地将日志文件加载到内存中吗?

2 个回答
  • 这里的关键是注意RDD在分区中被拆分(参见本答案的结尾),每个分区都是一组元素(例如可以是文本行或整数).分区用于并行化不同计算单元中的计算.

    所以关键不在于文件是否太大而是分区是否是.在这种情况下,在常见问题解答中:"Spark的操作符将数据溢出到磁盘,如果它不适合内存,允许它在任何大小的数据上运行良好".这里解决了生成OOM的大型分区的问题.

    现在,即使分区可以适合内存,这样的内存也可以满.在这种情况下,它会从内存中驱逐另一个分区以适应新分区.驱逐可能意味着:

      完全删除分区:在这种情况下,如果再次需要分区,则重新计算分区.

      分区在指定的存储级别中持久存在.每个RDD可以"标记"为要使用缓存/坚持这种存储级别,请参阅该如何.

    内存管理在这里得到了很好的解释:"Spark在内存中存储LRU缓存中的分区.当缓存达到其大小限制时,它会从中删除条目(即分区).当分区具有"disk"属性时(即,您的持久性级别允许)将分区存储在磁盘上),它将被写入硬盘驱动器并且它所消耗的内存将被释放,除非你要求它.当你请求它时,它会被读入内存,如果没有足够的内存其他一些来自缓存的较旧条目将被逐出.如果你的分区没有"磁盘"属性,则驱逐只是意味着破坏缓存条目而不将其写入硬盘".

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

    如果您已经有一个集合(例如java中的列表),则可以使用parallelize()并指定分区数.集合中的元素将分组.

    如果在HDFS中使用外部文件:"Spark为文件的每个块创建一个分区(HDFS中默认为128MB)".

    如果从本地文本文件中读取,每一行(以新行"\n"结束,结束字符可以更改,请参阅此内容)是一个元素,并且几行形成一个分区.

    最后,我建议您阅读本文以获取更多信息,并决定如何选择分区数量(太多或太少?).

    2023-02-13 17:26 回答
  • 我认为这个问题在Spark网站(https://spark.apache.org/faq.html)的FAQ面板中得到了很好的解答:

    如果我的数据集不适合内存会发生什么? 通常,每个数据分区都很小并且适合内存,并且这些分区一次只能处理几个.对于不适合内存的非常大的分区,Spark的内置运算符对数据集执行外部操作.

    当缓存的数据集不适合内存时会发生什么? Spark可以将其溢出到磁盘,也可以在每次请求时重新计算不适合RAM的分区.默认情况下,它使用重新计算,但您可以将数据集的存储级别设置为MEMORY_AND_DISK以避免这种情况.

    2023-02-13 17:26 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有