【问题标题】:Storing a Graph in Spark Graphx with HDFS使用 HDFS 在 Spark Graphx 中存储图形
【发布时间】:2015-10-26 11:08:24
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 嗨 @edenmark 能够找到解决方案,我也在寻找存储构造图的方法,然后稍后加载它以进行查询

标签: apache-spark spark-graphx


【解决方案1】:

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)

【讨论】:

  • graphx 和 spark 的新手,但对我来说是 sc.get.objectFile 而不是 sc.objectFile[T]。除此之外,这应该被标记为正确答案
【解决方案2】:

正如您所提到的,您必须保存边缘数据,并可能保存顶点数据。问题是您是否使用自定义顶点或边缘类。如果边或顶点上没有属性,那么您只需保存边文件并从中重新创建图形。使用 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 只是因为我倾向于使用多个程序来处理同一个数据文件,但这实际上取决于您的文件系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2018-09-28
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多