2015-08-04 2 views
4

Я построил график в GraphX ​​Spark. Этот график будет иметь потенциально 1 миллиард узлов и более 10 миллиардов краев, поэтому я не хочу, чтобы строить этот график снова и снова.Хранение графика в Spark Graphx с HDFS

Я хочу иметь возможность создать его один раз, сохранить его (я думаю, что лучше всего в HDFS), запустить некоторые процессы на нем, а затем получить доступ к нему через пару дней или недель, добавить новые узлы и ребрами и запустить на нем еще несколько процессов.

Как это сделать в Graphix Apache Spark?

EDIT: Я думаю, что нашел потенциальное решение, но мне бы хотелось, чтобы кто-то подтвердил, что это лучший способ.

Если у меня есть график, скажем graph, я должен хранить график его vertexRDD и его edgeRDD отдельно в текстовом файле. Затем, в конце времени, я могу получить доступ к этим текстовые файлы, например, так:

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

Один вопрос у меня сейчас: я должен использовать saveAsTextFile() или saveAsObjectFile()? И тогда как мне получить доступ к этому файлу позднее?

ответ

1

Как вы упомянули, вам необходимо сохранить ребро и, возможно, данные о вершинах. Вопрос в том, используете ли вы пользовательские вершинные или граничные классы. Если на ребрах или вершинах нет атрибутов, вы можете просто сохранить файл края и воссоздать график из этого. Простой пример использования GraphLoader будет:

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

Единственная проблема заключается в том, что GraphLoader.edgeListFile возвращает график [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 просто потому, что, как правило, использовать несколько программ для процессов и тот же файл данных, но это действительно зависит от файловой системы.

9

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) 
+2

довольно новый для графика и искры, но для меня это был sc.get.objectFile вместо sc.objectFile [T]. Кроме того, это должно быть отмечено как правильный ответ – alex9311