Apache spark 联合大量RDD引发堆栈溢出错误时引发火花

Apache spark 联合大量RDD引发堆栈溢出错误时引发火花,apache-spark,rdd,Apache Spark,Rdd,当我使用“++”组合许多RDD时,我得到了错误堆栈溢出错误 Spark版本1.3.1 环境:纱线客户--驱动器存储器8G RDD的数量超过4000个。每个RDD都从大小为1GB的文本文件中读取 它是以这种方式生成的 val collection = (for ( path <- files ) yield sc.textFile(path)).reduce(_ union _) 使用SparkContext.union(…)一次合并多个RDD 您不希望一次只做一个,因为RDD.uni

当我使用“++”组合许多RDD时,我得到了错误堆栈溢出错误

Spark版本1.3.1 环境:纱线客户--驱动器存储器8G

RDD的数量超过4000个。每个RDD都从大小为1GB的文本文件中读取

它是以这种方式生成的

val collection = (for (
  path <- files
) yield sc.textFile(path)).reduce(_ union _)

使用
SparkContext.union(…)
一次合并多个RDD


您不希望一次只做一个,因为RDD.union()会为每个RDD在沿袭中创建一个新步骤(任何计算中都会有一组额外的堆栈帧),而SparkContext.union()会一次完成所有步骤。这将确保不会出现堆栈溢出错误

当一个接一个地联合RDD时,似乎可以进入一系列非常长的递归函数调用。 在这种情况下,我们需要增加JVM堆栈内存。 在带有选项
--驱动程序java选项“-Xss 100M”
的spark中,驱动程序jvm堆栈内存配置为100M


Sean Owen的解决方案还以更优雅的方式解决了这个问题。

输入数据的大小是多少?默认情况下,Spark只使用内存RDD序列化。如果不适合,您可能想尝试使用“磁盘上持久化”选项。@eliasah问题已更新。但是输入的大小有什么关系?@C4stor你能给一些代码吗?val collection=(对于(路径我完全同意,但我只是想知道它是否能确保不会出现堆栈溢出错误?是的,因为
RDD.union()
在沿袭中创建了一个新的步骤(在任何计算中都有一组额外的堆栈帧)对于每个RDD,而
SparkContext.union()
一次完成。谢谢!我将编辑您的答案,添加您在评论中提到的信息。我相信这就完成了答案。是否有类似的方法可以同时加入多个数据帧。我面临着类似的问题,即我一次加入一个数据帧,而不是一次加入所有数据帧。
 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)
  .....