Spark sql 连续join次数太多导致内存溢出

问题描述

由于要使
用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)

解决过程

  1. 模拟集群里足够多次的join的数据,主要是通过循环,不断调用join
  2. 启动程序后,使用 jvisualvm监控进程内存使用情况,开启内存溢出时,生成dump文件。
  3. 程序内存溢出后,分析堆转储文件如下图:

Spark sql 连续join次数太多导致内存溢出_第1张图片
点击这些浪费内存的对象,进去,可以看到这个值存储的什么数据,也可以将数据导出。
Spark sql 连续join次数太多导致内存溢出_第2张图片

解决方法

从存储的内容来看,是spark存储的执行计划太长。所以考虑截断执行整个流程。

  1. 思路:df.join.collect.createdf.join.collect.createdf…
  2. 代码实现以上思路就可以。

你可能感兴趣的:(spark)