问题描述
由于要使
用spark做类似递归的代码重构,需要多次join。大概就是df.join().join().join()…,当规划完成,调用action算子时。报错如下:
java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3332) at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137)
解决过程
- 模拟集群里足够多次的join的数据,主要是通过循环,不断调用join
- 启动程序后,使用 jvisualvm监控进程内存使用情况,开启内存溢出时,生成dump文件。
- 程序内存溢出后,分析堆转储文件如下图:
点击这些浪费内存的对象,进去,可以看到这个值存储的什么数据,也可以将数据导出。
解决方法
从存储的内容来看,是spark存储的执行计划太长。所以考虑截断执行整个流程。
- 思路:df.join.collect.createdf.join.collect.createdf…
- 代码实现以上思路就可以。