ede*_*ark 5 apache-spark spark-graphx
我在Spark的GraphX中构建了一个图形.这个图表可能有10亿个节点和超过100亿个边缘,所以我不想一遍又一遍地构建这个图.
我希望能够构建一次,保存它(我认为最好的是HDFS),在它上面运行一些进程,然后在几天或几周内访问它,添加一些新的节点和边缘,然后运行还有更多的流程.
我怎么能在Apache Spark的GraphX中做到这一点?
编辑:我想我找到了一个潜在的解决方案,但我希望有人确认这是否是最好的方法.
如果我有一个图表,比方说graph,我必须将图形的顶点RDD和它的edgeRDD分别存储在文本文件中.然后,稍后,我可以访问这些文本文件,如下所示:
graph.vertices.saveAsTextFile(somePath)
graph.edges.saveAsTextFile(somePath)
Run Code Online (Sandbox Code Playgroud)
我现在面临的一个问题是:我应该使用saveAsTextFile()还是saveAsObjectFile()?然后我该如何在以后访问这些文件?
Gau*_*mar 12
GraphX还没有图形保存机制.因此,下一个要做的最好的事情是保存边和顶点并从中构造图形.如果顶点本质上是复杂的,则应使用序列文件来保存它们.
vertices.saveAsObjectFile("location/of/vertices")
edges.saveAsObjectFile("location/of/edges")
Run Code Online (Sandbox Code Playgroud)
稍后,您可以从磁盘读取并构建图形.
val vertices = sc.objectFile[T]("/location/of/vertices")
val edges = sc.objectFile[T]("/location/of/edges")
val graph = Graph(vertices, edges)
Run Code Online (Sandbox Code Playgroud)
小智 1
正如您所提到的,您将必须保存边和可能的顶点数据。问题是您是否使用自定义顶点或边类。如果边或顶点上没有属性,那么您可以只保存边文件并从中重新创建图形。使用 GraphLoader 的一个简单示例是:
graph.edges.saveAsTextFile(path)
...
val myGraph = GraphLoader.edgeListFile(path)
Run Code Online (Sandbox Code Playgroud)
唯一的问题是 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)
}
Run Code Online (Sandbox Code Playgroud)
我通常使用 saveAsText 只是因为我倾向于使用多个程序来处理同一个数据文件,但这实际上取决于您的文件系统。
| 归档时间: |
|
| 查看次数: |
3722 次 |
| 最近记录: |