" java.lang.OutOfMemoryError:请求的数组大小超过VM限制"在pyspark期间collect_list()执行

时间:2017-10-03 13:35:36

标签: apache-spark pyspark out-of-memory spark-dataframe pyspark-sql

我有一个5000万行的大型数据集,大约有40列浮点数。

出于自定义转换的原因,我尝试使用 pyspark collect_list()函数收集每列的所有浮点值,使用以下伪代码:

for column in columns:
   set_values(column, df.select(collect_list(column)).first()[0])

对于每一列,它执行collect_list()函数并将值设置为其他内部结构。

我正在运行上述独立群集,其中包含2个8核和64 GB RAM主机,每个主机为1个执行器分配最多30 GB和6个核心,我在执行期间遇到以下异常,我怀疑它必须处理收集的数组的大小。

  

java.lang.OutOfMemoryError:请求的数组大小超过VM限制

我在spark-defaults.conf中尝试了多种配置,包括分配更多内存,分区号,并行性,甚至Java选项,但仍然没有运气。

所以我的假设是collect_list()与较大数据集上的执行者/驱动程序资源密切相关或与这些资源无关?

我可以使用任何设置来帮助我消除此问题,否则我必须使用collect()功能吗?

1 个答案:

答案 0 :(得分:0)

collect_list并不比仅仅调用collect更好。对于大型数据集来说,两者都是非常糟糕的主意。并且几乎没有实际应用。

两者都需要与记录数成比例的内存量,collect_list只会增加随机播放的开销。

换句话说 - 如果您没有选择,并且需要本地结构,请使用selectcollect并增加驱动程序内存。它不会让事情变得更糟:

df.select(column).rdd.map(lambda x: x[0]).collect()