我无法处理230M边缘的图形。 我克隆了apache.spark,构建了它,然后在集群上尝试了它。
我使用Spark Standalone Cluster:
-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.count
和graph.edges.count
答案 0 :(得分:3)
我建议您进行二进制搜索以查找群集可以处理的最大数据大小。取50%的图表,看看是否有效。如果是,请尝试75%。等
我的经验法则是,对于给定大小的输入,您需要20-30倍的内存。对于4.5 GB,这表明限制大约为100 GB。你有这个数额。我没有使用GraphX的经验:它可能为内存使用增加了另一个倍增器。在我看来,你根本没有足够的记忆。