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 ,再次验证,问题解决。

参考资料

  • 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

你可能感兴趣的:(Spark OutOfMemoryError解决方案)