Spark OutOfMemoryError解决方案

最近遇到一些数据分析校验的工作,初识spark。之前一直可以正常跑的程序最近常常出现OutOfMemoryError错误。

初步分析:

  • 打开出现错误的任务,查看出错时的堆栈信息。我的错误发生在reduce后collectAsList时候内存溢出了。

解决思路:

  1. 给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出来。
  2. 使用Memory Analyzer 工具对dump出来的堆栈内存进行分析,下载地址https://www.eclipse.org/mat/
  3. 分析dump文件发现堆栈使用正常。登陆spark UI界面,进入Executors页面,查看driver和各个executor内存分配及使用情况。
  4. 发现driver的memory分配为512M,检查spark-submit提交命令和代码中均没有对driver进行内存分配,所以使用spark提供的默认值。
  5. 查资料,collectAsList操作会在driver上进行,由于本次collectAsList数据量较大,所以driver的内存溢出了。
  6. 给spark-submit提交命令添加driver内存分配参数--driver-memory 6g ,再次验证,问题解决。

参考资料

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容