最近遇到一些数据分析校验的工作,初识spark。之前一直可以正常跑的程序最近常常出现OutOfMemoryError错误。
初步分析:
- 打开出现错误的任务,查看出错时的堆栈信息。我的错误发生在reduce后collectAsList时候内存溢出了。
解决思路:
- 给spark-submit提交命令添加打印log参数
--conf "spark.executor.extraJavaOptions=-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=\tmp\dumpex" --conf "spark.driver.extraJavaOptions=-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=\tmp\dumpdr"
这样下一次运行出现OutOfMemoryError的时候会将executor和driver的堆栈使用情况dump出来。 - 使用Memory Analyzer 工具对dump出来的堆栈内存进行分析,下载地址https://www.eclipse.org/mat/
- 分析dump文件发现堆栈使用正常。登陆spark UI界面,进入Executors页面,查看driver和各个executor内存分配及使用情况。
- 发现driver的memory分配为512M,检查spark-submit提交命令和代码中均没有对driver进行内存分配,所以使用spark提供的默认值。
- 查资料,collectAsList操作会在driver上进行,由于本次collectAsList数据量较大,所以driver的内存溢出了。
- 给spark-submit提交命令添加driver内存分配参数
--driver-memory 6g
,再次验证,问题解决。
参考资料
- http://spark.apache.org/docs/latest/configuration.html#application-properties
- http://www.cnblogs.com/lestatzhang/p/10626022.html
- https://www.cnblogs.com/saratearing/p/5813403.html
- https://blog.csdn.net/zpf336/article/details/83006569
- http://www.jobplus.com.cn/article/getArticleDetail/30566
- https://www.jianshu.com/p/c4b6ed734e72
- https://www.cnblogs.com/lestatzhang/p/10611357.html
网友评论