我尝试在循环的每次迭代中向现有RDD追加一个条目。我的代码到现在为止:
var newY = sc.emptyRDD[MatrixEntry]
for (j <- 0 until 8000) {
var arrTmp = Array(MatrixEntry(j, j, 1))
var rddTmp = sc.parallelize(arrTmp)
newY = newY.union(rddTmp)
}
进行这8000次迭代当我尝试从该RDD中取出(10)时出现错误但是如果我尝试使用较小的数字,那么每件事都可以。
错误Exception in thread "main" java.lang.StackOverflowError
at scala.collection.TraversableLike$class.builder$1(TraversableLike.scala:229)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:233)
at scala.collection.immutable.List.map(List.scala:296)
at org.apache.spark.rdd.UnionRDD.getPartitions(UnionRDD.scala:84)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250)
at scala.Option.getOrElse(Option.scala:121)
帮助?
答案 0 :(得分:2)
您遇到的问题与Stackoverflow due to long RDD Lineage重复,但您的代码根本不应该与之相关。
如果你想要单一矩阵,只需用范围映射:
val newY = spark.sparkContext.range(0, 8000).map(j => MatrixEntry(j, j, 1))
循环并行化不会缩放并保留驱动程序内存中的所有数据Why does SparkContext.parallelize use memory of the driver?