我在使用sparklyr运行Spark时遇到了一些奇怪的问题。
我目前在R生产服务器上,通过spark://<my server>:7077
以客户端模式连接到我的Spark群集,然后从MS SQL Server中提取数据。
我最近能够做到这一点没有任何问题,但我最近得到了一个更大的集群,现在我有内存问题。
首先,我得到了莫名其妙的记忆力&#39;我处理过程中的错误。这发生了几次然后我开始得到内存无法创建新线程&#39;错误。我在R生产服务器和Spark服务器上检查了我使用的线程数与用户的最大数量,并且我没有接近最大值。
我重启了我的主节点,现在正在:
# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create GC thread. Out of system resources.
到底发生了什么事?
以下是我的规格:
- 通过root
用户运行的Spark Standalone
- Spark版本2.2.1
- Sparklyr版本0.6.2
- Red Hat Linux
答案 0 :(得分:1)
我偶然发现了这个。事实证明,当您在客户端模式下在外部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)上设置资源。后者将其置于火花环境以及闪光应用的其余部分。