如果在MapPartiton中使用Iterator-to-Iterator转换,那么它将如何允许将数据溢出到磁盘。据我所知,MapPartition需要内存中的整个分区来处理,但如果我使用Iterator-to-Iterator,那么数据如何溢出到磁盘(尽管事实上MapPartiton需要memmory中的整个分区)。
答案 0 :(得分:0)
这是一个错误的概念,即MapPartition需要内存中的完整数据。
MapPartition就像Map一样,它一次作用于一个分区。
http://bytepadding.com/big-data/spark/spark-map-vs-mappartitions/
答案 1 :(得分:0)
从概念上讲,迭代器到迭代器的转换意味着定义一个 一次评估一个元素的过程。因此,Spark可以适用 该过程分批记录,而不是读取整个记录 分区到内存中或使用所有输出创建集合 记录在内存中,然后返回它。所以, 迭代器到迭代器的转换允许Spark进行操作 太大的分区无法容纳在单个执行程序的内存中 没有内存不足的错误。
此外,将分区保留为迭代器可以使Spark更有选择地使用磁盘空间。迭代器到迭代器的转换允许Spark只溢出那些不适合内存的记录,而不是溢出一个不适合内存的整个分区,从而节省了磁盘I / O和重新计算的成本。 >
摘录自“ High Performance Spark”