我编写了一个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和连接几乎不可能解决这个问题。