Apache Spark-迭代器和内存消耗

时间:2019-04-26 07:30:35

标签: apache-spark

我是spark的新手,对迭代器的spark内存使用有疑问。

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

1 个答案:

答案 0 :(得分:0)

这两者的第一个区别是forEach()是一个动作,而mapPartition()是一个转换。比较forEachforEachPartition会更有意义,因为它们都是动作,并且它们都作用于驱动程序上的最终累积数据。请参阅here,以获取有关这两个的详细讨论。至于内存消耗,实际上取决于您返回给驱动程序的数据量。作为经验法则,请记住使用limit(), take(), first()等方法在驱动程序上返回结果,并避免使用collect(),除非您确定数据可以容纳在驱动程序的内存中。

可以将mapPartitionmapflatMap函数进行比较,它们将通过应用某种转换来修改RDDs数据。 mapPartition效率更高,因为当map对数据集中的每个项目执行相同的操作时,它将执行给定功能的次数更少。有关这两个详细信息,请参见here