toLocalIterator 是如何工作的?

Gau*_*hah 4 hadoop apache-spark hadoop2 pyspark

我试图了解如何toLocalIterator工作,我读了一些帖子和博客,但是我不确定一件事。

它是否一次将所有分区复制到驱动程序节点并创建迭代器?或者它一次复制一个分区的数据,然后创建一个迭代器?

Dav*_*vid 5

它将一次引入一个分区。根据文档

返回一个包含此 RDD 中所有元素的迭代器。

迭代器将消耗与该 RDD 中最大分区一样多的内存。

注意这会导致多个 Spark 作业,并且如果输入 RDD 是广泛转换的结果(例如,与不同分区器连接),为了避免重新计算,应首先缓存输入 RDD。

迭代器将“消耗与最大分区一样多的内存”,可以理解为只有 1 个(整个)分区将位于驱动程序节点上。

因此,第一个分区被发送到驱动程序。如果继续迭代并到达第一个分区的末尾,则第二个分区将被发送到驱动程序节点。如果父RDD没有被缓存,这也会导致数据的重新计算。