错误:

org.apache.spark.SparkException: Job aborted due to stage failure: Total size of serialized results of 1401 tasks (1024.3 MB) is bigger than spark.driver.maxResultSize (1024.0 MB)


我在调用spark-shell时遇到了此异常

sqlContext.cacheTable("TableName")
sqlContext.sql("SELECT COUNT(*) FROM TableName").count()


我知道collect()可能会向驱动程序发送很大的结果,但是这里只需要计数,所以我不明白为什么要使用1024.3 MB内存。如果未缓存表,则sql查询可以正常工作。

最佳答案

当我将表格格式从文本文件更改为镶木地板时,我遇到了这个问题。
起初,这项工作运行得更快更好。但是经过几次尝试,驱动程序抛出了熟悉的异常:

Total size of serialized results of 498 tasks (1024.8 MB) is bigger than spark.driver.maxResultSize (1024.0 MB)

随着spark.driver.maxResultSize增加(2g),我遇到了GC问题:

Exception in thread "broadcast-hash-join-9" java.lang.OutOfMemoryError: GC overhead limit exceeded at org.apache.spark.sql.catalyst.expressions.UnsafeRow.copy(UnsafeRow.java:535)


As the official doc description

具有较高的限制可能会导致驱动程序出现内存不足错误(取决于spark.driver.memory和JVM中对象的内存开销)。设置适当的限制可以保护驱动程序免受内存不足错误的影响。

因此,同时增加maxResultSizememoryOverhead

10-06 15:01