联合时很多RDD抛出堆栈溢出错误

时间:2015-05-29 06:27:55

标签: apache-spark rdd

当我使用" ++"为了结合大量的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)
  .....

2 个答案:

答案 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的解决方案也以更优雅的方式解决了这个问题。