【问题标题】:Java running out of memory when using collect_list in PySpark在 PySpark 中使用 collect_list 时 Java 内存不足
【发布时间】:2018-01-23 02:56:43
【问题描述】:

我目前正在使用 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 没有太多经验,因此我们将不胜感激。

【问题讨论】:

    标签: java database hadoop hive pyspark


    【解决方案1】:

    您显然正试图将一个巨大结果集的所有行加载到内存中。

    我怀疑 collect_list 引起了一些问题。

    这很可能是对的。

    解决方案要么是增加堆大小1,要么是更改处理结果集的方式,以便您不需要全部保存同时在记忆中。


    1 - ... 可能还有更多的内存、更大的机器等。你可以看到这是怎么回事。

    【讨论】:

    • 您的意思是我正在尝试将来自collect_list 的巨大结果集加载到内存中,还是您的意思是我正在读取的表格正在加载到内存中?
    • 前者。至少,在我看来是这样的。
    • 增加堆大小有效,但我需要考虑以不同的方式处理数据。看来我现在只是在掩盖问题。
    猜你喜欢
    • 2018-08-29
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    相关资源
    最近更新 更多