【Spark SQL案例】持续提交大量insert作业导致driver oom

举报
Yunz Bao 发表于 2020/05/16 18:19:13 2020/05/16
【摘要】 现网案例分享:用户使用DLI sdk持续提交大量insert小作业,平均1h出现一次driver oom,application重启。重启导致正在运行的作业失败,报错:Java Heap Space。

故障场景

用户使用DLI sdk持续提交大量insert小作业,平均90个/5min。平均1h出现一次driver oom,application重启。

重启导致正在运行的作业失败,报错:Java Heap Space。

image-20200516180138016


故障分析

  1. 首先查看Driver gc日志,发现一段时间后开始频繁full GC,但一直gc不掉,导致driver oom,因此怀疑有内存泄漏;

    image.png

  2. 登录客户集群,根据作业信息获取内存dump信息;

  3. 用MAT解析dump文件,发现有一类对象占用了近4GB内存

    img

  4. 进一步分析,发现org.apache.spark.sql.execution.ui.SQLExecutionUIData占据了3G内存。


    总共684个对象。


    其中主要是执行计划的描述信息String。


综上分析,是SparkUI中保存的作业数太多,SQLExecutionUIData的作业信息数据占用了大量内存没有释放导致Driver OOM。

故障解决

  1. 查找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)
       }
    }

    img

因此为了避免该问题,需要将该配置项降为500。修改后验证ok,问题解决。


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。