错误:
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中对象的内存开销)。设置适当的限制可以保护驱动程序免受内存不足错误的影响。
因此,同时增加
maxResultSize
和memoryOverhead
。