6

我在 Spark 的 GraphX 中构建了一个图表。这个图可能有 10 亿个节点和超过 100 亿条边,所以我不想一遍又一遍地构建这个图。

我希望能够构建一次,保存它(我认为最好的是在 HDFS 中),在其上运行一些进程,然后在几天或几周内访问它,添加一些新节点和边缘,然后运行一些更多的过程。

如何在 Apache Spark 的 GraphX 中做到这一点?

编辑:我想我已经找到了一个潜在的解决方案,但我希望有人确认这是否是最好的方法。

如果我有一个图,比如说graph,我必须将它的 vertexRDD 和它的 edgeRDD 分别存储在一个文本文件中。然后,稍后,我可以访问这些文本文件,如下所示:

graph.vertices.saveAsTextFile(somePath)
graph.edges.saveAsTextFile(somePath)

我现在的一个问题是:我应该使用 saveAsTextFile() 还是 saveAsObjectFile() ?然后我应该如何在以后访问这些文件?

4

2 回答 2

14

GraphX 还没有图形保存机制。因此,接下来要做的最好的事情是保存边和顶点并从中构造图形。如果您的顶点本质上是复杂的,您应该使用序列文件来保存它们。

 vertices.saveAsObjectFile("location/of/vertices")
 edges.saveAsObjectFile("location/of/edges")

稍后,您可以从磁盘读取并构建图形。

val vertices = sc.objectFile[T]("/location/of/vertices")
val edges = sc.objectFile[T]("/location/of/edges")
val graph = Graph(vertices, edges)
于 2015-11-13T14:04:06.767 回答
1

正如您所提到的,您将不得不保存边缘和可能的顶点数据。问题是您是否使用自定义顶点或边缘类。如果边或顶点上没有属性,那么您只需保存边文件并从中重新创建图形。使用 GraphLoader 的一个简单示例是:

graph.edges.saveAsTextFile(path)
...
val myGraph = GraphLoader.edgeListFile(path)

唯一的问题是 GraphLoader.edgeListFile 返回一个 Graph[Int, Int] 这对于大图来说可能是个问题。一旦达到数十亿,您将执行以下操作:

graph.edges.saveAsTextFile(path)
graph.vertices.saveAsTextFile(path)
....
val rawData = sc.textFile(path)
val edges = rawData.map(convertToEdges)
val vert = sc.textFile(path).map(f => f.toLong)
val myGraph = (verts, edges, 1L)

def convertToEdges(line : String) : Edge[Long] = {
val txt = line.split(",")
new Edge(txt(0), txt(1), 1L)
}

我通常使用 saveAsText 只是因为我倾向于使用多个程序来处理同一个数据文件,但这实际上取决于您的文件系统。

于 2015-08-07T20:08:41.710 回答