在 PySpark 中使用 collect_list 时 Java 内存不足

标签 java database hadoop hive pyspark

我目前正在使用 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/

相关文章:

java - 在矩形区域中找到矩形最接近的可能位置

java - 配置映射以连接字符串

java - SQL 异常executeQuery:17041,索引::3 处缺少 IN 或 OUT 参数

java - 创建项目时 Talend Open Studio 大数据错误

hadoop - Sqoop无效的连接URL SQL Server

java - App Engine 后端与 Google Cloud Messaging 向 1000 多名用户发送消息

java - 将首选项迁移到 AndroidX

hadoop - Kafka-Connect HDFS-Protobuf到 Parquet

javascript - 如何重复执行nodejs mysql查询直到得到想要的结果?

php - 如何在 HTML 水平表中显示 mysql 查询输出