1

だから、私は以下に示すようなパターンを持っています。

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では、ある場所で大きな文字列が作成されますが、これはまだそれほど大きくはありません (< 1 GB) が、java.lang.OutOfMemoryError: Java heap spaceその文字列の作成中にエラーが発生することがあります。これは、エグゼキュータのメモリが非常に大きい (8 GB) 場合でも発生します。

この記事によると、UserメモリとSparkメモリがあります。さて、私の場合、UserメモリとSparkメモリのどちらを増やせばいいのでしょうか?

PS: Spark バージョン 2.0 を使用しています

4

1 に答える 1

2

1G raw 文字列は、8G 以上のメモリを簡単に使用できます。XML 用の XMLEventReader のようなストリーミング処理を使用することをお勧めします。

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
于 2016-11-07T13:46:38.030 に答える