spark 内存问题记录 GC overhead报错、kyro缓存溢出、driver端数据溢出、container内存不足

GC开销超过限制

报错:

java.lang.OutOfMemoryError: GC overhead limit exceeded at scala.collection.immutable.HashMap.scala.collection.immutable.HashMap makeHashTrieMap(HashMap.scala:175)

处理:分为两个角度,一是是检查代码,减少不必要的冗余,重用的RDD要序列化缓存,减少shuffle数据,加大并行度;二从参数配置看,加大executor内存,增加shuffle buffer缓存,但有时候也因为job写的太低效而出现无效。

空指针异常

报错:

java.lang.NullPointerException at com.immomo.recommend.recommend_molive anonfun 1.apply(recommend_molive.scala:83)

处理:该问题一般是代码中的,检查数组,对象内容是否可能为空;尤其是表数据,能有字段的值为null,但没有处理null,出现这个错误。

kyro 缓存溢出

报错:

java.lang.OutOfMemoryError: Java heap space at com.esotericsoftware.kryo.io.Output.require(Output.java:168)

处理:该报错堆栈可以看到是kyro请求空间,结果不够出现溢出,因为kyro序列化器能序列化的单个对象最大限制为spark.kryoserializer.buffer.max定义,这个值最大为2g。所以建议优先检查代码中的大对象,想办法裁剪对象大小,如果不行再考虑增大spark.kryoserializer.buffer.max数值。

driver端数据溢出

报错:

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

处理:对于collect和一些操作,driver会接收各task执行后的数据,spark.driver.maxResultSize参数控制接收数据大小,建议先检查代码,避免或减少take,collect操作,如果不成功再考虑增大该参数。

container内存不足被kill

报错:

Job aborted due to stage failure ExecutorLostFailure (executor 2101 exited caused by one of the running tasks) Reason: Container marked as failed: container_1491814332016_46280_01_009179 on host

处理:1、增大分区数,使用 set spark.sql.shuffle.partitions=1000(或更大)
2、调整代码,减少数据读取量

单个分区数据空间超过2G

报错:

java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:828) at org.apache.spark.storage.DiskStore$$anonfun$getBytes$2.apply(DiskStore.scala:103) at org.apache.spark.storage.DiskStore$$anonfun$getBytes$2.apply(DiskStore.scala:91) at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1307) at org.apache.spark.storage.DiskStore.getBytes(DiskStore.scala:105) at org.apache.spark.storage.BlockManager.org$apache$spark$storage$BlockManager$$doGetLocalBytes(BlockManager.scala:496) at org.apache.spark.storage.BlockManager$$anonfun$getLocalBytes$2.apply(BlockManager.scala:474) at org.apache.spark.storage.BlockManager$$anonfun$getLocalBytes$2.apply(BlockManager.scala:474) at

scala.Option.map(Option.scala:146)
处理:该问题是分区数据存储的时候出现报错,因为单个分区上限是2G,超过该限制则报错,解决方法是调大分区,使用repartition或对含有shuffle算子指定一个大分区即可。

不仅如此,shuffle 过程fetch block的最大size也是2G。

更多spark优化可以看spark常用性能调优Spark调优指南

赞(1) 打赏
特别声明:除特殊标注,本站文章均为原创,遵循CC BY-NC 3.0,转载请注明出处。三伏磨 » spark 内存问题记录

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏