6

Spark の GraphX でグラフを作成しました。このグラフには 10 億のノードと 100 億以上のエッジが含まれる可能性があるため、このグラフを何度も作成する必要はありません。

一度ビルドして保存し(HDFSが最適だと思います)、いくつかのプロセスを実行し、数日または数週間でアクセスし、新しいノードとエッジを追加して実行する機能が必要ですその上でさらにいくつかのプロセス。

Apache Spark の GraphX でそれを行うにはどうすればよいですか?

編集:私は潜在的な解決策を見つけたと思いますが、これが最善の方法であるかどうかを誰かに確認してもらいたいです.

たとえば、グラフがある場合、graphグラフを vertexRDD と edgeRDD 別にテキスト ファイルに格納する必要があります。その後、次のように、これらのテキスト ファイルにアクセスできます。

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

私が今持っている質問の 1 つは、 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 に答える