sparklyr 的 Spark 内存问题

Spark Memory Issues with sparklyr

我在 Spark 运行 sparklyr 上遇到了一些奇怪的问题。

我目前在 R 生产服务器上,通过 spark://<my server>:7077 以客户端模式连接到我的 Spark 集群,然后从 MS SQL 服务器提取数据。

我最近能够毫无问题地执行此操作,但最近我获得了一个更大的集群,现在出现了内存问题。

首先,我在处理过程中遇到了无法解释的 'out of memory' 错误。这种情况发生了几次,然后我开始收到 'Out of memory unable to create new thread' 错误。我检查了我使用的线程数与 R 生产服务器和 Spark 服务器上用户的最大值相比,我离最大值还差得很远。

我重新启动了我的主节点,现在得到:

# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create GC thread. Out of system resources.

这到底是怎么回事??

这是我的规格:
- Spark Standalone 运行 通过 root 用户。
- Spark 版本 2.2.1
- Sparklyr 版本 0.6.2
- 红帽 Linux

我偶然发现了这一点。事实证明,当您在客户端模式下对外部 Spark 集群进行 运行 操作时,它仍然会在本地运行 Spark。我 认为 本地 Spark 没有分配足够的内存,这是导致错误的原因。我的修复很简单:

而不是通过以下方式分配内存:

spark_conf = spark_config()
spark_conf$`spark.driver.memory` <- "8G"
spark_conf$`spark.executor.memory` <- "12G"

我用过:

spark_conf = spark_config()
spark_conf$`sparklyr.shell.driver-memory` <- "8G"
spark_conf$`sparklyr.shell.executor-memory` <- "12G"

前者会直接在集群(spark context)上设置资源。后者将其设置在 spark 上下文以及 sparklyr 应用程序的其余部分中。