如何通过Sparklyr在本地模式下运行Spark时配置驱动程序内存?

我正在使用Sparklyr在具有244GB RAM的虚拟机上以本地模式运行Spark应用程序。 在我的代码中,我使用spark_read_csv()从一个文件夹读取~50MB的csvs,然后从第二个文件夹读取~1.5GB的csvs。 我的问题是,当尝试读取第二个文件夹时,应用程序会抛出错误。

据我了解,问题是驱动程序JVM可用的默认RAM是512MB – 对于第二个文件夹来说太小(在本地模式下,所有操作都在驱动程序JVM中运行,如此处所述如何设置Apache Spark Executor内存 。所以我需要将spark.driver.memory参数增加到更大的值。

问题是我不能通过sparklyr文档中描述的常规方法设置此参数(即通过spark_config()config.yml文件或spark-defaults.conf文件):

在本地模式下,当你运行spark-submit时,已经使用默认的内存设置启动了JVM,因此在conf中设置“spark.driver.memory”实际上并不会为你做任何事情。 相反,您需要运行spark-submit,如下所示:

 bin/spark-submit --driver-memory 2g --class your.class.here app.jar 

(来自如何设置Apache Spark Executor内存 )。

我以为我可以通过在sparklyr.shell.driver-memory添加sparklyr.shell.driver-memory选项来复制上面的bin/spark-submit命令; 如Sparklyr文档中所述; sparklyr.shell* options是传递给spark-submit命令行参数,即添加sparklyr.shell.driver-memory: 5Gconfig.yml文件应该相当于运行bin/spark-submit --driver-memory 5G

我现在已经尝试了上述所有选项,但它们都没有更改Spark应用程序中的驱动程序内存(我通过查看Spark UI的’Executors’选项卡进行检查)。

那么如何通过Sparklyr在本地模式下运行Spark时更改驱动程序内存?

感谢@Aydin K的建议。最终,我能够通过首先将java更新为64位(允许在JVM中使用> 4G的RAM)来配置驱动程序内存,然后使用spark_config()对象中的sparklyr.shell*参数:

 config <- spark_config() config$`sparklyr.shell.driver-memory` <- '30G' config$`sparklyr.shell.executor-memory` <- '30G' sc <- spark_connect(master='local', version='2.0.1', config=config) 

我遇到了和你一样的问题,并且通过调整本地内存设置,我的mavenized java应用程序(本地[*])没有运气。 尝试了很多组合(spark-env.sh,spark-defaults.conf等)..

因此我做了以下解决方法:

1)将所需的内存大小参数添加到:/opt/spark/conf/spark-defaults.conf

 spark.driver.memory 4g spark.executor.memory 2g 

2)构建一个jar(在我的情况下为mvn package

3)通过spark-submit从命令行提交申请:

 spark-submit --repositories https://mvnrepository.com --packages graphframes:graphframes:0.5.0-spark2.1-s_2.10 --class com.mypackage.myApp --verbose --master local[*] ./target/com.mypackage.myApp-1.0.jar 

瞧,没有更多java“内存不足”空间问题:-)此外,spark UI现在显示执行程序选项卡中的正确值。