Я не могу обработать граф с ребрами 230M. Я клонировал apache.spark, построил его, а затем попробовал его на кластере.GraphX не работает с относительно большими графиками
Я использую Спарк Standalone кластера:
-5 machines (each has 12 cores/32GB RAM)
-'spark.executor.memory' == 25g
-'spark.driver.memory' == 3g
Graph имеет 231359027 края. И его файл весит 4,524,716,369 байт. График представлен в текстовом формате:
sourceVertexId destinationVertexId
Мой код:
object Canonical {
def main(args: Array[String]) {
val numberOfArguments = 3
require(args.length == numberOfArguments, s"""Wrong argument number. Should be $numberOfArguments .
|Usage: <path_to_grpah> <partiotioner_name> <minEdgePartitions> """.stripMargin)
var graph: Graph[Int, Int] = null
val nameOfGraph = args(0).substring(args(0).lastIndexOf("/") + 1)
val partitionerName = args(1)
val minEdgePartitions = args(2).toInt
val sc = new SparkContext(new SparkConf()
.setSparkHome(System.getenv("SPARK_HOME"))
.setAppName(s" partitioning | $nameOfGraph | $partitionerName | $minEdgePartitions parts ")
.setJars(SparkContext.jarOfClass(this.getClass).toList))
graph = GraphLoader.edgeListFile(sc, args(0), false, edgeStorageLevel = StorageLevel.MEMORY_AND_DISK,
vertexStorageLevel = StorageLevel.MEMORY_AND_DISK, minEdgePartitions = minEdgePartitions)
graph = graph.partitionBy(PartitionStrategy.fromString(partitionerName))
println(graph.edges.collect.length)
println(graph.vertices.collect.length)
}
}
После того как я запустить его, я столкнулся ряд java.lang.OutOfMemoryError: Java heap space
ошибок и, конечно, я не получил результата. У меня проблема в коде? Или в конфигурации кластера? Потому что он отлично работает для относительно небольших графиков. Но для этого графика он никогда не работал. (И я не думаю, что края 230M являются слишком большими данными)
Благодарим за любые советы!
ПОСТАНОВИЛИ
Я не ставил достаточно памяти для программы драйвера. Я изменил кластерную конфигурацию:
-4 workers (each has 12 cores/32GB RAM)
-1 master with driver program (each has 12 cores/32GB RAM)
-'spark.executor.memory' == 25g
-'spark.driver.memory' == 25g
А также это не было хорошей идеей собрать все вершины и ребра, чтобы сосчитать их. Это легко сделать так: graph.vertices.count
и graph.edges.count