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中的堆空间不足,但有足够的内存的主要内容,如果未能解决你的问题,请参考以下文章

理解 JVM 内存分配和 Java 内存不足:堆空间

Microsoft Visual Studio 没有足够的内存空间继续执行程序

STM32的堆与栈与编译信息查看

为啥复制系列图片总显示没有足够的可用空间

Windows Media Player显示空间不足

使用 tomcat 6 dbcp 和 oracle 11 瘦驱动程序的堆空间不足