Spark Graphx java.lang.OutOfMemoryError

时间:2018-11-12 14:31:42

标签: java scala apache-spark rdd spark-graphx

Spark GraphX模块有问题。我有一个5节点群集,具有23.5G内存和每个节点24个内核。我使用spark-shell提交代码,因此我在客户端模式下使用Spark。 在我的配置中,我有1个主节点和4个从属节点。这是我的spark-defaults.conf:

spark.executor.instances                8
spark.executor.memory                   10g
spark.driver.memory                     18g
spark.executor.cores                    10
spark.driver.cores                      18
spark.default.parallelism               144
spark.serializer                        org.apache.spark.serializer.KryoSerializer

我读取并存储了2个非常小的文件,文件大小总计40mb。

这是我的代码:

val input1 = sc.textFile("/home/data/spark/nodes.txt")
val vertexArray = input1.map(line => (line.toLong, mutable.Set[VertexId]()))

val input2 = sc.textFile("/home/data/spark/edges.txt")
val splitRdd = input2.map( line => line.split(" ") )
val edgeArray = splitRdd.map(line => Edge(line(0).toLong, line(1).toLong, "bla"))

val vertices: RDD[(VertexId, mutable.Set[VertexId])] = vertexArray
val edges: RDD[Edge[String]] = edgeArray
val graph = Graph(vertices, edges).partitionBy(EdgePartition2D, 4)

var filteredGraph: Graph[mutable.Set[VertexId], String] = graph.mapVertices((vid, vdata) => {
  mutable.Set[VertexId]()
}).cache()
val temp: VertexRDD[mutable.Set[VertexId]] = filteredGraph.aggregateMessages[mutable.Set[VertexId]](
  triplet => {
    if(triplet.dstId < 0){
      triplet.sendToDst(mutable.Set[VertexId](triplet.srcId))
    }
  },
  (oldSet, newSet) => oldSet ++ newSet // Merge Message
)
filteredGraph = filteredGraph.joinVertices(temp)((id, oldSet, newSet) => newSet).cache()
val temp2: VertexRDD[mutable.Set[VertexId]] = filteredGraph.aggregateMessages[mutable.Set[VertexId]](
  triplet => {
    if(triplet.dstId > 0){
      triplet.sendToDst(triplet.srcAttr.filter(id=>triplet.dstId!=id && triplet.dstId < id))
    }
  },
  (oldSet, newSet) => oldSet ++ newSet // Merge Message
)
val candidatesRDD: RDD[(Long, List[Long])] = temp2.map(vertex => {
  (vertex._1.asInstanceOf[Long], vertex._2.asInstanceOf[ mutable.Set[Long]].toList)
})


val newNames = Seq("rid", "candidates")
val candidatesDF = candidatesRDD.toDF(newNames: _*)
val candidatesDFMod = candidatesDF.withColumn("candidates", explode($"candidates"))
candidatesDFMod.show

如果我进行计算,则几次后我会java.lang.OutOfMemoryError: Java heap space欺骗一位执行者。在此Spark尝试再次对其进行计算后,它将重新启动阶段,但最终将再次出现相同的异常。为什么会这样?计算将填充完整的10G执行程序存储器。我的Spark配置是否错误?我尝试了几个spark-defaults.conf的排列。我在每个节点上尝试了3个Executor,并更改了内存大小,依此类推。但是每次它都以相同的异常结束。

也许有人对这个问题有想法?

亲切的问候

Sedir Mohammed

1 个答案:

答案 0 :(得分:0)

spark.executor.instances 8

spark.executor.cores 10

val graph = Graph(vertices, edges).partitionBy(EdgePartition2D, 4) ^^^

如果仅创建4个分区,那么拥有8个具有10个内核的执行器是没有意义的。请记住,执行器上的所有分区必须一起容纳在内存中,以避免GC崩溃。尝试使用更多的分区,以使10个分区容易容纳在内存中,每个分区可能需要数百MB的输入数据。 另外,请检查每个工作节点上是否实际有10GB的内存,执行驱动程序的机器上是否有16GB的内存-如果您的某些工作器上没有可用的RAM,则可以减少内核数量和数量Spark配置中的内存。