我目前正在使用 PySpark 并在包含大约 6 亿条记录的表上运行查询。该表本身约为 300gb。我的查询看起来像这样:
select f1, collect_list(struct(f2, f3)) as fdata
from table
group by 1
目前,我收到此错误:
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill -9 %p"
# Executing /bin/sh -c "kill -9 1010"...
Killed
另一件事是 (f2, f3)
元组的分布不均匀。一些 f1
可能有 100k 个这样的元组,而其他一些 f1
可能只有 5 个。我怀疑 collect_list
导致了一些问题。
我总是可以增加簇的大小,但我想知道我是否可以对表做一些事情。按 f1
划分也不是一种选择,因为它具有非常高的维度。我没有太多使用 Spark 或 Hive 的经验,因此我们将不胜感激。
最佳答案
您显然正试图将一个巨大结果集的所有行加载到内存中。
I suspect collect_list is causing some issues.
这很可能是正确的。
解决方案要么是增加堆大小1,要么改变处理结果集的方式,这样您就不需要全部保留同时在内存中。
1 - ... 并且可能需要更多内存、更大的机器等。您可以看到它的发展方向。
关于在 PySpark 中使用 collect_list 时 Java 内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48393490/