sparklyr中的堆空间不足,但有足够的内存
Posted
技术标签:
【中文标题】sparklyr中的堆空间不足,但有足够的内存【英文标题】:Running out of heap space in sparklyr, but have plenty of memory 【发布时间】:2017-05-14 01:15:21 【问题描述】:即使是相当小的数据集,我也会遇到堆空间错误。我可以确定我没有用完系统内存。例如,考虑一个包含大约 20M 行和 9 列的数据集,它占用 1GB 磁盘空间。我正在使用 30gb 内存的 Google Compute 节点上使用它。
假设我在一个名为df
的数据框中有这些数据。以下工作正常,虽然有点慢:
library(tidyverse)
uniques <- search_raw_lt %>%
group_by(my_key) %>%
summarise() %>%
ungroup()
以下抛出java.lang.OutOfMemoryError: Java heap space
。
library(tidyverse)
library(sparklyr)
sc <- spark_connect(master = "local")
df_tbl <- copy_to(sc, df)
unique_spark <- df_tbl %>%
group_by(my_key) %>%
summarise() %>%
ungroup() %>%
collect()
我尝试this suggestion 为 Spark 增加堆空间。问题仍然存在。在htop
上查看机器的状态,我发现总内存使用量从未超过 10gb。
library(tidyverse)
library(sparklyr)
config <- spark_config()
config[["sparklyr.shell.conf"]] <- "spark.driver.extraJavaOptions=-XX:MaxHeapSize=24G"
sc <- spark_connect(master = "local")
df_tbl <- copy_to(sc, df)
unique_spark <- df_tbl %>%
group_by(my_key) %>%
summarise() %>%
ungroup() %>%
collect()
最后,根据 Sandeep 的评论,我尝试将 MaxHeapSize
降低到 4G
。 (MaxHeapSize
是每个虚拟工作者还是整个 Spark 本地实例?)我仍然遇到堆空间错误,而且我没有使用太多系统内存。
【问题讨论】:
将MaxHeapSize=24G
减少到MaxHeapSize=4GB
,因为你只有1 GB 的数据。它不需要 24 GB 内存。即使是 4GB 也足够了。
谢谢;它仍然得到错误。我澄清了问题的文本以解决这个问题。
您能否发布您用来运行此作业的 spark 提交命令??
来自 spark 文档: spark.driver.extraJavaOptions
:- 传递给驱动程序的额外 JVM 选项字符串。例如,GC 设置或其他日志记录。注意:在客户端模式下,这个配置不能直接在你的应用程序中通过 SparkConf 设置,因为此时驱动程序 JVM 已经启动。相反,请通过--driver-java-options
命令行选项或在您的默认属性文件中进行设置。你也是这样吗??
你知道如何从 sparklyr 获取 spark 提交吗?我可以获取日志,但不能获取提交到集群的实际作业。
【参考方案1】:
在查看 Sandeep 的建议时,我开始深入研究 sparklyr
deployment notes。这些提到驱动程序在这个阶段可能会耗尽内存,并调整一些设置来纠正它。
这些设置并没有解决问题,至少一开始没有。但是,将问题隔离到 collect
阶段使我能够在 SO 上使用 SparkR 找到 similar problems。
这些答案部分取决于设置环境变量SPARK_MEM
。把它们放在一起,我得到它的工作如下:
library(tidyverse)
library(sparklyr)
# Set memory allocation for whole local Spark instance
Sys.setenv("SPARK_MEM" = "13g")
# Set driver and executor memory allocations
config <- spark_config()
config$spark.driver.memory <- "4G"
config$spark.executor.memory <- "1G"
# Connect to Spark instance
sc <- spark_connect(master = "local")
# Load data into Spark
df_tbl <- copy_to(sc, df)
# Summarise data
uniques <- df_tbl %>%
group_by(my_key) %>%
summarise() %>%
ungroup() %>%
collect()
【讨论】:
以上是关于sparklyr中的堆空间不足,但有足够的内存的主要内容,如果未能解决你的问题,请参考以下文章