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

时间:2017-06-21 03:44:40

标签: java r apache-spark sparklyr

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

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

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

  

在本地模式下,当你运行spark-submit时,已经使用默认的内存设置启动了一个JVM,因此设置" spark.driver.memory"在你的conf中,你真的为你做了什么。相反,您需要按如下方式运行spark-submit:

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

(来自How to set Apache Spark Executor memory)。

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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)

答案 1 :(得分:0)

我遇到了与你相同的问题,并且通过调整本地内存设置,我的mavenized java应用程序(local [*])没有运气。尝试了很多组合(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&#34;内存不足&#34;空间问题:-)此外,spark UI现在在执行程序选项卡中显示正确的值。