如何在Spark Cluster

时间:2015-11-30 10:12:25

标签: scala apache-spark rdd spark-graphx

我们已经使用Pregel API为3lac顶点找到最短路径。我们应该将每个顶点作为源顶点一次,并确定所有这些执行中的最短路径。我的代码如下所示,

def shortestPath(sc: SparkContext, mainGraph: Graph[(String, String, Double), Double], singleSourceVertexFlag: Boolean) {

var noOfIterations = mainGraph.vertices.count();
// If single source vertext is true, pass only count as one iteration only
if (singleSourceVertexFlag) {
  noOfIterations = 1
} else { // else loop through complete list of vertices
  noOfIterations = mainGraph.vertices.count()
}

for (i <- 0 to (noOfIterations.toInt - 1)) {
  val sourceId: VertexId = i
  val modGraph = mainGraph.mapVertices((id, attr) =>
    if (id == sourceId) (0.0)
    else (Double.PositiveInfinity))

  val loopItrCount = modGraph.vertices.count().toInt;
  val sssp = modGraph.pregel(Double.PositiveInfinity, loopItrCount, EdgeDirection.Out)(

    (id, dist, newDist) =>
      if (dist < newDist) dist
      else newDist, // Vertex Program

    triplet => { // Send Message
      if (triplet.srcAttr + triplet.attr < triplet.dstAttr) {
        Iterator((triplet.dstId, triplet.srcAttr + triplet.attr))
      } else {
        Iterator.empty
      }
    },

    (a, b) =>
      if (a < b) a // Merge Message
      else b)

  sssp.unpersist(true)
  modGraph.unpersist(true)

  println("****Shortest Path End**** SourceId" + sourceId)

}

}

从这段代码中我必须从每个循环中读取最短路径,然后从它们中识别最小值作为最终输出(这是未来的部分,我还没有编写相同的代码)。

现在这个当前代码适用于15node图和1112节点图。但是当我尝试执行22k节点图的算法时,该算法针对55个源节点执行,然后因内存不足错误而停止。我们有一个双节点集群(1节点 - 64GB RAM,2节点 - 32GB RAM)

问题是,
1.如何在Spark集群上处理for循环?我是否需要在代码中修改以便优化代码? 2.我试图使用unpersist,以便在每个循环中清除RDD并为每个循环创建新的循环。但是在执行55个节点后,我仍然会内存不足。应该怎么做才能为所有节点执行相同的操作?

0 个答案:

没有答案