Din*_*108 8 java garbage-collection scala apache-spark
我阅读了map和mapPartitions之间的理论差异,并且很清楚何时在各种情况下使用它们.
但我下面描述的问题更多地基于GC活动和内存(RAM).请阅读下面的问题: -
=>我写了一个map函数来将Row转换为String.因此,RDD [org.apache.spark.sql.Row]的输入将映射到RDD [String].但是使用这种方法,将为RDD的每一行创建地图对象.因此,创建如此大量的对象可以增加GC活动.
=>为了解决上述问题,我想到了使用mapPartitions.因此,该对象的数量变得等于分区的数量.mapPartitions将Iterator作为输入,并接受返回和java.lang.Iterable.但大多数Iterable,如Array,List等都在内存中.那么,如果我有大量数据,那么以这种方式创建Iterable会导致内存不足吗?或者是否有任何其他集合(java或scala)应该在这里使用(如果内存开始填充,溢出到磁盘)?或者我们应该只使用mapPartitions以防RDD完全在内存中?
提前致谢.任何帮助将不胜感激.
小智 2
如果您考虑JavaRDD.mapPartitions需要FlatMapFunction(或类似的变体DoubleFlatMapFunction),预计将返回Iteratornot Iterable。如果底层收集是惰性的,那么您无需担心。
RDD.mapPartitions接受一个函数 fromIterator到Iterator。
我一般来说,如果您使用参考数据,您可以替换mapPartitions为map并使用静态成员来存储数据。这将具有相同的占用空间并且更容易编写。