昨天在Spark Sql上执行几条涉及数据量几百G的Sql语句时频繁失败,日志中出现大量以下错误:
ERROR executor.CoarseGrainedExecutorBackend: Driver Disassociated [akka.tcp://sparkExecutor@ip-10-0-20-22:62262] -> [akka.tcp://sparkDriver@ip-10-0-20-30:14214] disassociated! Shutting down.
ERROR cluster.YarnClusterScheduler: Lost executor 124 on ip-10-0-20-22: remote Akka client disassociated
随后,ssh到10.0.20.22上看yarn的NodeManager的日志,发现下面这条日志:
INFO org.apache.hadoop.yarn.server.nodemanager.NMAuditLogger: USER=root OPERATION=Container Finished - Killed TARGET=ContainerImpl RESULT=SUCCESS APPID=application_1428571334989_100355 CONTAINERID=container_1428571334989_100355_01_000281
从这条日志可以看出,该Container被yarn kill了(RESULT=SUCCESS不准确)
这个错误有以下特点:
- 只有数据量几百G的sql查询才会失败
- application的非常多的container被kill
结合以上特点,推断可能是oom(out of memory)了,但日志中又没有看到oom的报错且container是被yarn kill了,进一步推断可能是executor使用的内存超过了配置的值(通过spark.executor.memory
设置),并且超出使用的内存量超过了spark.yarn.driver.memoryOverhead
的值。
尝试将spark.yarn.driver.memoryOverhead
调大至10G,执行原来失败的语句,成功,问题解决(如果是executor内存超了,相应调大spark.yarn.excutor.memoryOverhead
的值)。
如果你遇到Driver Disassociated
的问题,还有一个原因可能是executor连不上Driver,可能是网络问题或者host配置问题,这时你需要确认报错的container是否能连上Driver