对于 Java 内存不足错误,我应该增加哪种类型的 Spark 内存?

Posted

技术标签:

【中文标题】对于 Java 内存不足错误,我应该增加哪种类型的 Spark 内存?【英文标题】:Which type of Spark memory should I increase on Java out of memory error? 【发布时间】:2016-11-07 12:16:40 【问题描述】:

所以,我有一个如下所示的模式。

def someFunction(...) : ... = 

  // Somewhere here some large string (still < 1 GB) is made ...
  //  ... and sometimes I get Java.lang.OutOfMemoryError while building that string


....
val RDDb = RDDa.map(x => someFunction(...))

所以,在someFunction 内部,在一个地方创建了一个大字符串,但仍然不是那么大(java.lang.OutOfMemoryError: Java heap space 错误。即使我的执行程序内存非常大(8 GB),也会发生这种情况。

根据this article,有User内存和Spark内存。现在在我的情况下,我应该增加哪一个分数,用户内存或 Spark 内存?

PS:我使用的是 Spark 2.0 版

【问题讨论】:

你见过这个吗? ***.com/questions/21138751/… 我使用的是 Spark 2.0 版。他们在那个版本中有一个新的内存管理系统。 【参考方案1】:

1G 原始字符串可以轻松使用超过 8G 的内存。最好使用流处理,例如 XMLEventReader for XML。

参考 Rober Sedgewick 和 Kevin Wayne 所著的 Algorithm 一书中的估计。每个字符串有 56 个字节的开销。

我写了一个简单的测试程序,用-Xmx8G运行

object TestStringBuilder 
  val m = 1024 * 1024
  def memUsage(): Unit = 
    val runtime = Runtime.getRuntime

    println(
      s"""max: $runtime.maxMemory() / m M 
         |allocated: $runtime.totalMemory() / m M 
         |free: $runtime.freeMemory() / m M""".stripMargin)
  

  def main(args: Array[String]): Unit = 
    val builder = new StringBuilder()
    val size = 10 * m
    try 
      while (true) 
        builder.append(Math.random())
        if (builder.length % size == 0) 
          println(s"len is $builder.length / m M")
          memUsage()
        
      
    
    catch 
      case ex: OutOfMemoryError =>
        println(s"OutOfMemoryError len is $builder.length/m M")
        memUsage()
      case ex =>
        println(ex)
    
  

输出可能是这样的。

len is 140 M
max: 7282 M allocated: 673 M free: 77 M
len is 370 M
max: 7282 M allocated: 2402 M free: 72 M
len is 470 M
max: 7282 M allocated: 1479 M free: 321 M
len is 720 M
max: 7282 M allocated: 3784 M free: 314 M
len is 750 M
max: 7282 M allocated: 3784 M free: 314 M
len is 1020 M
max: 7282 M allocated: 3784 M free: 307 M
OutOfMemoryError len is 1151 M
max: 7282 M allocated: 3784 M free: 303 M

【讨论】:

发誓,为什么原始字符串会占用那么多内存。这太疯狂了!

以上是关于对于 Java 内存不足错误,我应该增加哪种类型的 Spark 内存?的主要内容,如果未能解决你的问题,请参考以下文章

增加堆以避免 WEKA 中的内存不足错误

Eclipse 堆空间(内存不足错误)

对于等待工作线程的主机线程,我应该使用哪种内存顺序?

使用 VisualVm 分析堆转储时出现内存不足错误

由于堆大小增加,android中的内存不足错误

如何永久增加java堆内存?