当前位置: 首页 > 知识库问答 >
问题:

Apache Spark-迭代器和内存消耗

邹驰
2023-03-14

我是spark的新手,有关于迭代器使用spark内存的问题。

在使用数据集的Foreach()或MapPartitions()(甚至直接调用RDD的iterator()函数时,spark是否需要先将整个分区加载到RAM中(假设分区在磁盘中),还是在我们继续迭代时可以延迟加载数据(意味着,spark可以只加载部分分区数据执行任务,并将中间结果保存到磁盘)

共有1个答案

太叔京
2023-03-14

这两者的第一个区别是,foreach()是一个操作,而mappartition()是一个转换。比较foreachforeachpartition会更有意义,因为它们都是操作,并且都处理驱动程序上最终累积的数据。关于这两个方面的详细讨论,请参阅此处。至于内存消耗,它实际上取决于您返回给驱动程序的数据的多少。作为经验法则,记住使用limit()、take()、first()等方法在驱动程序上返回结果,并且避免使用collection(),除非您确信数据可以放入驱动程序的内存。

mappartition可以与mapflatmap函数进行比较,它们将通过应用一些转换来修改数据集的数据。mapPartition的效率更高,因为当map对DataSet中的每个项执行相同的函数时,mapPartition执行给定函数的次数更少。有关这两个功能的更多细节,请参阅此处。

 类似资料:
  • 我正在构建一个Spark应用程序,我必须在其中缓存大约15GB的CSV文件。我在这里读到了Spark 1.6中引入的新: https://0x0fff.com/spark-memory-management/ 作者在和之间有所不同(火花内存又分为)。正如我所了解的,Spark内存对于执行(洗牌、排序等)和存储(缓存)东西是灵活的——如果一个需要更多内存,它可以从另一个部分使用它(如果尚未完全使用)

  • 从for循环讲起 我们在控制语句里学习了Rust的for循环表达式,我们知道,Rust的for循环实际上和C语言的循环语句是不同的。这是为什么呢?因为,for循环不过是Rust编译器提供的语法糖! 首先,我们知道Rust有一个for循环能够依次对迭代器的任意元素进行访问,即: for i in 1..10 { println!("{}", i); } 这里我们知道, (1..10) 其本身

  • 问题内容: 我有一个〜10M记录的MySQL表,可以使用SqlAlchemy进行交互。我发现对这个表的大子集的查询将消耗过多的内存,即使我以为我使用的是内置生成器,它可以智能地获取数据集的一口大小的块: 为了避免这种情况,我发现我必须构建自己的迭代器,该迭代器会分块地进行处理: 这是正常的还是关于SA内置发电机我缺少什么? 这个问题的答案似乎表明内存消耗是不希望的。 问题答案: 大多数DBAPI实

  • 使用SpringMVC和Thymeleaf,我正在构建一个包含一些javascript的html视图。 在页面中,th: each与迭代值一起使用,为一组按钮提供唯一的超文本标记语言id。 我的问题出现在尝试生成javascript时,该javascript将对每个按钮id使用jQuery引用。 在另一种视图解析语言中,我会使用代码: (以上可能不是100%语法正确,但我希望你明白——我试图做的是

  • 这篇内容挺多的,而且比内容不好理解。或许新手看完后,还会一脸懵逼,不过这是正常的,如果你看完后,是迷糊的,那么建议你继续学习后面的内容,等学完,再回来看几次。 注:这也是我第二次修改内容没有改过的章节。 目录

  • 这个是stackoverflow里python排名第一的问题,值得一看: http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python 这是中文版: http://taizilongxu.gitbooks.io/stackoverflow-about-python/content/1/READM