apache-spark - GraphX 不适用于相对较大的图形

标签 apache-spark spark-graphx

我无法处理具有 230M 边的图形。 我克隆了 apache.spark,构建了它,然后在集群上进行了尝试。

我使用 Spark 独立集群:

-5 machines (each has 12 cores/32GB RAM)
-'spark.executor.memory' ==  25g
-'spark.driver.memory' == 3g

图有 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.countgraph.edges.count

最佳答案

我建议您进行二进制搜索以找到集群可以处理的最大数据量。取图表的 50%,看看是否可行。如果是,请尝试 75%。等等

我的经验法则是,对于给定大小的输入,您需要 20-30 倍的内存。对于 4.5 GB,这表明限制将在 100 GB 左右。你正好有那个数额。我没有使用 GraphX 的经验:它可能会增加内存使用的另一个乘数。在我看来,您只是没有足够的内存。

关于apache-spark - GraphX 不适用于相对较大的图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29050904/

相关文章:

apache-spark - 查询 Parquet 记录中的嵌套数组

scala - 将数据帧写入 HDFS 时出现 NumberFormatException 错误

hadoop - 如何用Spark尾部HDFS文件?

scala - Spark graphX 从数据帧创建 Edge/Vertex RDD

scala - Scala : compilation error: not found type

scala - GraphX 是如何在内部遍历 Graph 的?

apache-spark - Spark Streaming to Hive,每个分区的小文件太多

java - rdd.checkpoint 在 spark 作业中被跳过

scala - 在 Spark GraphX 中实现拓扑排序

scala - 在 Spark GraphX 中寻找最大边权重