我正在使用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时更改驱动程序内存?
答案 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现在在执行程序选项卡中显示正确的值。