2015-03-14 3 views
3

Я не могу обработать граф с ребрами 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

ответ

3

Что я предлагаю, вы делаете бинарный поиск, чтобы найти максимальный размер данных, которые может обрабатывать кластер. Возьмите 50% графика и посмотрите, работает ли это. Если да, попробуйте 75%. И т.д.

Мое эмпирическое правило 20-30 × Память для заданного размера ввода. Для 4.5 ГБ это предполагает, что предел составит около 100 ГБ. У вас точно такая сумма. У меня нет опыта работы с GraphX: он, вероятно, добавляет еще один множитель в использование памяти. По-моему, у вас просто недостаточно памяти.

 Смежные вопросы

  • Нет связанных вопросов^_^