【Spark SQL案例】持续提交大量insert作业导致driver oom
【摘要】 现网案例分享:用户使用DLI sdk持续提交大量insert小作业,平均1h出现一次driver oom,application重启。重启导致正在运行的作业失败,报错:Java Heap Space。
故障场景
用户使用DLI sdk持续提交大量insert小作业,平均90个/5min。平均1h出现一次driver oom,application重启。
重启导致正在运行的作业失败,报错:Java Heap Space。
故障分析
首先查看Driver gc日志,发现一段时间后开始频繁full GC,但一直gc不掉,导致driver oom,因此怀疑有内存泄漏;
登录客户集群,根据作业信息获取内存dump信息;
用MAT解析dump文件,发现有一类对象占用了近4GB内存
进一步分析,发现org.apache.spark.sql.execution.ui.SQLExecutionUIData占据了3G内存。
总共684个对象。
其中主要是执行计划的描述信息String。
综上分析,是SparkUI中保存的作业数太多,SQLExecutionUIData的作业信息数据占用了大量内存没有释放导致Driver OOM。
故障解决
查找spark源码,发现spark.sql.ui.retainedExecutions配置项默认值为1000。
kvstore.addTrigger(classOf[SQLExecutionUIData], conf.get(UI_RETAINED_EXECUTIONS)) { count =>
cleanupExecutions(count)
}
private def cleanupExecutions(count: Long): Unit = {
val countToDelete = count - conf.get(UI_RETAINED_EXECUTIONS)
if (countToDelete <= 0) {
return
}
val view = kvstore.view(classOf[SQLExecutionUIData]).index("completionTime").first(0L)
val toDelete = KVUtils.viewToSeq(view, countToDelete.toInt)(_.completionTime.isDefined)
toDelete.foreach { e =>
kvstore.delete(e.getClass(), e.executionId)
kvstore.delete(classOf[SparkPlanGraphWrapper], e.executionId)
}
}
因此为了避免该问题,需要将该配置项降为500。修改后验证ok,问题解决。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)