我在Spark的GraphX中构建了一个图形。这个图表可能有10亿个节点和超过100亿个边缘,所以我不想一遍又一遍地构建这个图。
我希望能够构建一次,保存它(我认为最好是在HDFS中),在其上运行一些进程,然后在几天或几周内访问它,添加一些新的节点和边缘,并在其上运行一些更多的进程。
我如何在Apache Spark的GraphX中做到这一点?
编辑:我想我找到了一个潜在的解决方案,但我希望有人确认这是否是最好的方法。如果我有一个图表,比如说graph
,我必须将图表的顶点RDD和它的edgeRDD分别存储在文本文件中。然后,稍后,我可以访问这些文本文件,如下所示:
graph.vertices.saveAsTextFile(somePath)
graph.edges.saveAsTextFile(somePath)
我现在面临的一个问题是:我应该使用saveAsTextFile()还是saveAsObjectFile()?然后我该如何在以后访问这些文件?
答案 0 :(得分:11)
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)
答案 1 :(得分: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,因为我倾向于使用多个程序来处理相同的数据文件,但这实际上取决于您的文件系统。