Apache-Spark Graph-frame在BFS上非常慢

时间:2016-12-19 17:06:04

标签: scala apache-spark graph breadth-first-search graphframes

我在下面的代码中使用了使用Scala的Apache Spark-GraphFrames,我在上面的代码中应用BFS并尝试找到Vertice 0到100之间的距离。

import org.apache.spark._
import org.graphframes._
import org.graphframes.GraphFrame
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.SQLContext
object SimpApp{
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("SimpApp")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val nodesList = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").option("inferSchema", "true").load("CSV File Path")
val edgesList= sqlContext.read.format("com.databricks.spark.csv").option("header", "true").option("inferSchema", "true").load("CSV File Path")
val v=nodesList.toDF("id")
val e=edgesList.toDF("src", "dst", "dist")
val g = GraphFrame(v, e)
var paths: DataFrame = g.bfs.fromExpr("id = 0").toExpr(s"id = 100").maxPathLength(101).run()  
paths.show()
sc.stop()
}
}

Soucre节点:0目标节点:100

顶点列表如下所示

id
0
1
2
3
.
.
.
up to
1000

这是边缘列表

src dst dist
0    1   2
1,   2,   1
2,   3,   5 
3,   4,   1
4,   5,   3
5,   6,   3
6,   7,   6
.    .   .
.    .   .
.    .   .
up to
999, 998, 4

但是上面给出的代码问题是,它需要花费大量时间才能执行0到100个顶点,因为它运行了4个小时但没有输出。 上面的代码我运行在具有12 GB RAM的单机上。

请指导我加快和优化代码。

1 个答案:

答案 0 :(得分:3)

要验证,我认为你试图找到图表未加权边缘的最短距离,因此使用BFS。在这种情况下,您可能希望从查询中删除maxPathLength(101),以便:

g.bfs.fromExpr("id = 0").toExpr("id = 100").run() 

BFS definition中所述:

  

maxPathLength是默认值为的路径长度限制   10.如果找不到长度< = maxPathLength的有效路径,则终止BFS。

通过在顶点0和顶点100之间指定101,它将尝试查找从0到100的任何和所有边长度为101的边,因此迭代次数很多。

BFS的有趣示例和最短距离可以在关于航班的经典图表场景中描述(参考:On-Time Flight Performance with GraphFrames for Apache Spark),其中顶点(或节点)是机场,而边缘是这些机场之间的航班。

如果您正试图在SFO(旧金山)和BUF(布法罗)之间寻找直飞航班,则BFS查询将是:

tripGraph.bfs.fromExpr("id = 'SFO'").toExpr("id = 'BUF').maxPathLength(1).run

如引用的链接中所述,没有直接航班,因此没有结果。但是,如果您将maxPathLength增加到2(即SFOBUF个节点之间的一个额外节点),那么您会找到许多路径(例如SFO> BOS> BUF或旧金山到波士顿到布法罗)

tripGraph.bfs.fromExpr("id = 'SFO'").toExpr("id = 'BUF').maxPathLength(2).run