Spark - 循环导致超出GC开销限制"

时间:2016-11-03 18:58:57

标签: scala loops apache-spark garbage-collection

我编写了一个Spark程序,它使用循环访问多个缓存表。

一段时间以来,代码执行得非常快,但在某些时候停止了进展。在查看Spark GUI时,我得到了超过" GC开销限制"。

代码基本上看起来像这样(它应该简单地说明代码和问题的结构,但实际上看起来不同):

val table1 = sqlc.read.load(...)
val table2 = sqlc.read.load(...)
val table3 = sqlc.read.load(...)

table1.registerTempTable("table1")
table2.registerTempTable("table2")
table3.registerTempTable("table3")

sqlc.cacheTable("table1")
sqlc.cacheTable("table2")
sqlc.cacheTable("table3")

val result = someArray.foldLeft(0.0) {
  (someAcc, someParam) => {
      someAcc + anotherArray.foldLeft(0.0){
         (anotherAcc, anotherParam) => {
            val val1 = sqlc.sql(SELECT ... FROM table1 ...).first().getDouble(0)
            val val2 = sqlc.sql(SELECT ... FROM table2 ...).first().getDouble(0)
            val val3 = sqlc.sql(SELECT ... FROM table3 ...).first().getDouble(0)
            anotherAcc + val3
        }
     }
  }
}

有人知道我做错了什么吗?

Btw。:火花驱动程序有90G的RAM,这个程序是在Zeppelin创建的新的Spark上下文中执行的。另据我所知,使用纯sql和连接几乎不可能解决这个问题。

0 个答案:

没有答案