我们已经使用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个节点后,我仍然会内存不足。应该怎么做才能为所有节点执行相同的操作?