如何在Spark中进行Iterator-to-Iterator转换,以便在Spark中将数据溢出到磁盘。

时间:2017-04-05 14:01:29

标签: apache-spark

如果在MapPartiton中使用Iterator-to-Iterator转换,那么它将如何允许将数据溢出到磁盘。据我所知,MapPartition需要内存中的整个分区来处理,但如果我使用Iterator-to-Iterator,那么数据如何溢出到磁盘(尽管事实上MapPartiton需要memmory中的整个分区)。

2 个答案:

答案 0 :(得分:0)

这是一个错误的概念,即MapPartition需要内存中的完整数据。

MapPartition就像Map一样,它一次作用于一个分区。

  1. 它将依次读取一个接一个的记录。
  2. 一旦处理完所有记录,它就会返回。
  3. http://bytepadding.com/big-data/spark/spark-map-vs-mappartitions/

答案 1 :(得分:0)

  

从概念上讲,迭代器到迭代器的转换意味着定义一个   一次评估一个元素的过程。因此,Spark可以适用   该过程分批记录,而不是读取整个记录   分区到内存中或使用所有输出创建集合   记录在内存中,然后返回它。所以,   迭代器到迭代器的转换允许Spark进行操作   太大的分区无法容纳在单个执行程序的内存中   没有内存不足的错误。

     

此外,将分区保留为迭代器可以使Spark更有选择地使用磁盘空间。迭代器到迭代器的转换允许Spark只溢出那些不适合内存的记录,而不是溢出一个不适合内存的整个分区,从而节省了磁盘I / O和重新计算的成本。 >

摘录自“ High Performance Spark”