当前位置: 首页 > 知识库问答 >
问题:

Apache Spark中的大型RDD[Matrix Entry]超出了GC开销限制

漆雕嘉茂
2023-03-14

我有一个csv文件存储了维度为6365x214的用户项的数据,我正在使用org的columnComplications()查找用户相似性。阿帕奇。火花mllib。利纳格。分发。坐标矩阵

我的代码如下:

import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.mllib.linalg.distributed.{RowMatrix, 
MatrixEntry, CoordinateMatrix}
import org.apache.spark.rdd.RDD

def rddToCoordinateMatrix(input_rdd: RDD[String]) : CoordinateMatrix = {

    // Convert RDD[String] to RDD[Tuple3]
    val coo_matrix_input: RDD[Tuple3[Long,Long,Double]] = input_rdd.map(
        line => line.split(',').toList
    ).map{
            e => (e(0).toLong, e(1).toLong, e(2).toDouble)
    }

    // Convert RDD[Tuple3] to RDD[MatrixEntry]
    val coo_matrix_matrixEntry: RDD[MatrixEntry] = coo_matrix_input.map(e => MatrixEntry(e._1, e._2, e._3))

    // Convert RDD[MatrixEntry] to CoordinateMatrix
    val coo_matrix: CoordinateMatrix  = new CoordinateMatrix(coo_matrix_matrixEntry)

    return coo_matrix
}

// Read CSV File to RDD[String]
val input_rdd: RDD[String] = sc.textFile("user_item.csv")

// Read RDD[String] to CoordinateMatrix
val coo_matrix = rddToCoordinateMatrix(input_rdd)

// Transpose CoordinateMatrix
val coo_matrix_trans = coo_matrix.transpose()

// Convert CoordinateMatrix to RowMatrix
val mat: RowMatrix = coo_matrix_trans.toRowMatrix()

// Compute similar columns perfectly, with brute force
// Return CoordinateMatrix
val simsPerfect: CoordinateMatrix = mat.columnSimilarities()

// CoordinateMatrix to RDD[MatrixEntry]
val simsPerfect_entries = simsPerfect.entries

simsPerfect_entries.count()

// Write results to file
val results_rdd = simsPerfect_entries.map(line => line.i+","+line.j+","+line.value)

results_rdd.saveAsTextFile("similarity-output")

// Close the REPL terminal
System.exit(0)

当我在spark shell上运行这个脚本时,在运行了一行代码simsPerfect\u条目之后,我得到了以下错误。count()

java.lang.OutOfMemoryError: GC overhead limit exceeded

我尝试了很多别人已经给出的解决方案,但都没有成功。

1通过增加每个执行器进程使用的内存量spark。遗嘱执行人。内存=1g

2通过减少驱动程序进程使用的内核数spark.driver.cores=1

建议我一些方法来解决这个问题。

共有1个答案

宗晟
2023-03-14

所有Spark转换都是惰性的,直到您实际实现它为止。定义RDD到RDD数据操作时,Spark只是将操作链接在一起,而不执行实际计算。因此,当您调用sims\u条目时。count(),执行操作链并获得您的编号。

错误GC开销限制超过意味着JVM垃圾回收器活动非常高,以至于停止了代码的执行。GC活性如此之高是由于以下原因:

  • 你产生了太多的小物体,并立即丢弃它们。看起来你不是。
  • 您的数据不适合JVM堆。就像如果你试图加载2GB的文本文件到RAM,但只有1GB的JVM堆。看起来这是你的案子。

要解决此问题,请尝试增加上的JVM堆数量:

  • 如果您有分布式Spark设置,请选择工作节点
 类似资料:
  • 问题内容: 我正在尝试建立一个包含2台服务器的Gridgain集群。 使用 GridDataLoader 将.csv文件中的数据(100万至5000万个数据)加载到Gridgain 。 从加载的数据中找到最小值,最大值,平均值等, 当在Eclipse中作为独立应用程序运行时,我得到正确的输出。 但是,在建立集群(eclipse环境中的2个服务器中的2个节点+我的Eclipse环境中的1个节点)的同

  • 问题内容: 我在一个程序中创建了这个错误,该程序创建了几个(数十万)HashMap对象,每个对象都有几个(15-20)文本条目。这些字符串必须全部收集(不分解成较小的数量),然后再提交给数据库。 根据Sun的说法,该错误发生“如果在垃圾回收上花费了太多时间:如果在垃圾回收上花费了总时间的98%以上,而回收不到2%的堆,则将引发OutOfMemoryError。 ”。 显然,可以使用命令行将参数传递

  • 问题内容: 我收到 java.lang.OutOfMemoryError: 在Android 1.4上运行gradle时, 超出了GC开销限制 …这是我的依赖: 如何解决? 问题答案: 将此添加到您的android闭包(构建gradle): 这样可以解决您的问题。不过,如果您遇到问题,请参见以下链接 GC开销限制超出错误

  • 使用当我尝试构建我的项目时,这种错误越来越多: 错误:任务“:app:CompiledEbugJavaWithJavac”执行失败。OutofMemoryError:超出GC开销限制 有什么办法解决这个问题吗?

  • 我正在尝试预处理一个大的txt文件(10G),并将其存储在二进制文件中以备将来使用。当代码运行时,速度会减慢,并以 异常线程"main"java.lang.OutOfMemoryError: GC开销限制超过 输入文件具有以下结构 这是我正在使用的代码: 基本上,它通过in文件并将数据存储到对象HMbicnt(这是一个哈希映射)。一旦在第二列中遇到新值,它应该将对象写入输出文件,释放内存并继续。

  • 问题内容: 我执行JUnit测试时收到以下错误消息: 我知道是什么OutOfMemoryError,但是GC开销限制是什么意思?我该如何解决? 问题答案: 该消息表示由于某种原因,垃圾收集器占用了过多的时间(默认情况下为该进程所有CPU时间的98%),并且每次运行时恢复的内存很少(默认为堆的2%)。 这实际上意味着你的程序停止任何进展,并且一直在忙于仅运行垃圾回收。 为了防止你的应用程序浪费CPU