当我使用" ++"为了结合大量的RDD,我得到了错误堆栈溢出错误。
Spark版本1.3.1 环境:纱线客户。 --driver-memory 8G
RDD的数量超过4000.每个RDD都从大小为1 GB的文本文件中读取。
以这种方式生成
val collection = (for (
path <- files
) yield sc.textFile(path)).reduce(_ union _)
files
小尺寸时效果很好。
而且有错误
错误重演。我猜这是一个被称为太多时间的递归函数?
Exception at org.apache.spark.rdd.RDD.partitions(RDD.scala:217)
at org.apache.spark.rdd.UnionRDD$$anonfun$1.apply(UnionRDD.scala:66)
at org.apache.spark.rdd.UnionRDD$$anonfun$1.apply(UnionRDD.scala:66)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:34)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
at scala.collection.AbstractTraversable.map(Traversable.scala:105)
at org.apache.spark.rdd.UnionRDD.getPartitions(UnionRDD.scala:66)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:219)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:217)
at scala.Option.getOrElse(Option.scala:120)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:217)
at org.apache.spark.rdd.UnionRDD$$anonfun$1.apply(UnionRDD.scala:66)
at org.apache.spark.rdd.UnionRDD$$anonfun$1.apply(UnionRDD.scala:66)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:34)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
at scala.collection.AbstractTraversable.map(Traversable.scala:105)
at org.apache.spark.rdd.UnionRDD.getPartitions(UnionRDD.scala:66)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:219)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:217)
at scala.Option.getOrElse(Option.scala:120)
.....
答案 0 :(得分:19)
使用SparkContext.union(...)
来同时联合多个RDD。
你不想一次一个地做这个,因为RDD.union()为每个RDD创建了一个新的步骤(在任何计算上有一组额外的堆栈帧),而SparkContext。 union()立即完成所有操作。这样可以确保不会出现堆栈溢出错误。
答案 1 :(得分:1)
似乎当union RDD逐个进入一系列非常长的递归函数调用时。
在这种情况下,我们需要增加JVM堆栈内存。
在带有选项--driver-java-options "-Xss 100M"
的spark中,驱动程序jvm堆栈内存配置为100M。
Sean Owen的解决方案也以更优雅的方式解决了这个问题。