2016-12-01 100 views
7

我通过理解地图和mapPartitions之间的差异,&很清楚何时在各种情况下使用它们。Spark RDD-地图vs mapPartitions

但我下面介绍的问题更多基于GC活动&内存(RAM)。请阅读下面的问题: -

=>我写了一个map函数来将Row转换为String。因此,RDD [org.apache.spark.sql.Row]的输入将被映射到RDD [String]。但是通过这种方法,将为RDD的每一行创建地图对象。因此创建如此大量的对象可能会增加GC活动。

=>为了解决上述问题,我想到了使用mapPartitions。所以,这些对象的数量就等于分区的数量。 mapPartitions将Iterator作为输入并接受返回值和java.lang.Iterable。但是像Array,List等Iterable大部分都在内存中。那么,如果我有大量数据,那么通过这种方式创建Iterable可能会导致内存不足?或者是否有其他应该在这里使用的集合(java或scala)(在内存开始填充时溢出到磁盘)?或者如果RDD完全在内存中,我们是否应该只使用mapPartition?

在此先感谢。任何帮助将不胜感激。

回答

1

如果你仔细想想JavaRDD.mapPartitions需要FlatMapFunction(或类似DoubleFlatMapFunction一些变体)预计将返回Iterator没有Iterable。如果底层收藏是懒惰的,那么你没有什么可担心的。

RDD.mapPartitions需要从IteratorIterator的功能。

我一般如果您使用的参考数据,你可以用map代替mapPartitions并使用静态成员来存储数据。这将有相同的脚印,并且会更容易编写。

+0

让静态变量没有意义。因为每次你的地图对象都会被创建。另外,如果某些人如何能够在一台机器上实现并行性,那么我应该同步静态变量。此外,FlatMapFunction使你覆盖“public Iterable call(Iterator itr)” –

+1

另外,你可以让我知道懒惰的集合或可能泄漏到磁盘的情况下内存(如果达到它的最大内存缓冲区限制)? –