Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
矩阵乘法期间Apache Spark java堆空间错误_Java_Apache Spark - Fatal编程技术网

矩阵乘法期间Apache Spark java堆空间错误

矩阵乘法期间Apache Spark java堆空间错误,java,apache-spark,Java,Apache Spark,我使用的Spark 2.0.1有两个工人(每个人一个执行者),每个人有20Gb。并运行以下代码: JavaRDD<MatrixEntry> entries = ...; // filing the data CoordinateMatrix cmatrix = new CoordinateMatrix(entries.rdd()); BlockMatrix matrix = cmatrix.toBlockMatrix(100, 1000); BlockMatrix cooc = ma

我使用的Spark 2.0.1有两个工人(每个人一个执行者),每个人有20Gb。并运行以下代码:

JavaRDD<MatrixEntry> entries = ...; // filing the data
CoordinateMatrix cmatrix = new CoordinateMatrix(entries.rdd());
BlockMatrix matrix = cmatrix.toBlockMatrix(100, 1000);
BlockMatrix cooc = matrix.transpose().multiply(matrix);
现在我甚至尝试每个执行器只使用一个内核。 有什么问题吗?我如何调试它并找到根本原因?谢谢

Upd.:失败阶段的详细信息:

org.apache.spark.rdd.RDD.flatMap(RDD.scala:374)
org.apache.spark.mllib.linalg.distributed.BlockMatrix.multiply(BlockMatrix.scala:478)
MyClass.generate(SimilarityGenerator.java:57)
MyClass.main(GenerateSimilarity.java:54)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:497)
org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:736)
org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:185)
org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:210)
org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:124)
org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

看起来稀疏矩阵乘法并没有以我所认为的方式实现。Spark自然地将块矩阵相乘,即使在几乎所有单元中都是零。我们实现了自己的乘法运算。下面是Scala代码(因此也是从某个地方复制的):


这是300亿倍,或者说仅仅是矩阵的240 GB内存。然后向量和结果需要内存。OOME看起来很清楚。你有多少物理内存?分配给JVM的资源有多少?最好的方法是使用VisualVM这样的分析器来查看这一代人在做什么。您正在使用JDK 8吗?它不再有perm gen了。每个工人都安装了2Tb硬盘,执行器内存为20Gb。是的,我正在使用JDK 8。如果spark仅在控制台群集上运行,是否可以使用VisualVM?另外,Spark是否应该将一些分区交换到HDD上,并且只对其中的一小部分使用RAM?32Gb中有20Gb可用,但其余部分应该由Cassandra使用。硬盘驱动器与JVM无关。让我们再做一次计算:300亿个双精度值,每双精度8字节,仅用于保存矩阵就意味着约240 GB。如果这个数学是正确的,240>20。这就是我。我错过了什么?我正在使用ApacheSpark,希望它足够智能,不会将所有内容都保存在内存中。矩阵应该分为块(默认值为1024x1024),并且在任何给定时刻,只有其中的一些块应该在内存中。
org.apache.spark.rdd.RDD.flatMap(RDD.scala:374)
org.apache.spark.mllib.linalg.distributed.BlockMatrix.multiply(BlockMatrix.scala:478)
MyClass.generate(SimilarityGenerator.java:57)
MyClass.main(GenerateSimilarity.java:54)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:497)
org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:736)
org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:185)
org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:210)
org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:124)
org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
def multiply(left: CoordinateMatrix, right: CoordinateMatrix): CoordinateMatrix = {
  val leftEntries = left.entries.map({ case MatrixEntry(i, j, v) => (j, (i, v)) })
  val rightEntries = right.entries.map({ case MatrixEntry(j, k, w) => (j, (k, w)) })

  val productEntries = leftEntries
    .join(rightEntries)
    .map({ case (_, ((i, v), (k, w))) => ((i, k), (v * w)) })
    .reduceByKey(_ + _)
    .map({ case ((i, k), sum) => MatrixEntry(i, k, sum) })

  new CoordinateMatrix(productEntries)
}