我是spark的新手,对迭代器的spark内存使用有疑问。
在使用数据集的Foreach()或MapPartitions()(甚至直接调用RDD的iterator()函数)时,spark是否需要首先将整个分区加载到RAM(假设分区位于磁盘中)或可以进行数据在我们继续迭代时被延迟加载(这意味着spark只能加载部分分区数据执行任务并将中间结果保存到磁盘)
答案 0 :(得分:0)
这两者的第一个区别是forEach()
是一个动作,而mapPartition()
是一个转换。比较forEach
和forEachPartition
会更有意义,因为它们都是动作,并且它们都作用于驱动程序上的最终累积数据。请参阅here,以获取有关这两个的详细讨论。至于内存消耗,实际上取决于您返回给驱动程序的数据量。作为经验法则,请记住使用limit(), take(), first()
等方法在驱动程序上返回结果,并避免使用collect()
,除非您确定数据可以容纳在驱动程序的内存中。
可以将mapPartition
与map
或flatMap
函数进行比较,它们将通过应用某种转换来修改RDDs数据。 mapPartition效率更高,因为当map对数据集中的每个项目执行相同的操作时,它将执行给定功能的次数更少。有关这两个详细信息,请参见here。