Wil*_*amS 114 memory apache-spark
如何增加Apache spark executor节点的可用内存?
我有一个2 GB的文件,适合加载到Apache Spark.我正在1台机器上运行apache spark,所以驱动程序和执行程序在同一台机器上.该机器有8 GB的内存.
当我在设置要在内存中缓存的文件后尝试计算文件的行时,我得到以下错误:
2014-10-25 22:25:12 WARN CacheManager:71 - Not enough space to cache partition rdd_1_1 in memory! Free memory is 278099801 bytes.
Run Code Online (Sandbox Code Playgroud)
我看了看文档,这里并设置spark.executor.memory到4g在$SPARK_HOME/conf/spark-defaults.conf
UI显示此变量在Spark环境中设置.你可以在这里找到截图
但是,当我转到Executor选项卡时,我的单个Executor的内存限制仍然设置为265.4 MB.我还是得到了同样的错误.
我尝试了这里提到的各种各样的东西,但我仍然得到错误,并且不清楚我应该在哪里更改设置.
我正在从spark-shell以交互方式运行我的代码
Gre*_*ret 170
由于您在本地模式下运行Spark spark.executor.memory,因此您已经注意到,设置将没有任何效果.这样做的原因是工作者"生活"在启动spark-shell时启动的驱动程序JVM进程中,并且用于此的默认内存为512M.你可以通过设置spark.driver.memory更高的值来增加它,例如5g.你可以通过以下两种方式做到:
在属性文件中设置它(默认为spark-defaults.conf),
spark.driver.memory 5g
Run Code Online (Sandbox Code Playgroud)或者在运行时提供配置设置
$ ./bin/spark-shell --driver-memory 5g
Run Code Online (Sandbox Code Playgroud)请注意,这不能通过在应用程序中设置它来实现,因为到那时已经太晚了,该进程已经开始使用一些内存.
265.4 MB的原因是Spark 将spark.storage.memoryFraction*spark.storage.safetyFraction专用于存储内存总量,默认情况下为0.6和0.9.
512 MB * 0.6 * 0.9 ~ 265.4 MB
Run Code Online (Sandbox Code Playgroud)
因此请注意,不是全部的驱动程序内存都可用于RDD存储.
但是当你开始在集群上运行它时,spark.executor.memory设置将在计算专用于Spark内存缓存的数量时接管.
Dmi*_*nov 36
另请注意,对于本地模式,您必须在启动jvm之前设置驱动程序内存量:
bin/spark-submit --driver-memory 2g --class your.class.here app.jar
Run Code Online (Sandbox Code Playgroud)
这将使用2G而不是默认的512M启动JVM.
细节在这里:
对于本地模式,您只有一个执行程序,并且此执行程序是您的驱动程序,因此您需要设置驱动程序的内存.*也就是说,在本地模式下,当你运行spark-submit时,已经使用默认的内存设置启动了JVM,因此在你的conf中设置"spark.driver.memory"实际上并不会为你做任何事情.相反,您需要按如下方式运行spark-submit
小智 9
Grega 提交的答案帮助我解决了我的问题。我正在从 Docker 容器内的 python 脚本本地运行 Spark。最初,我在 Spark 中处理某些数据时遇到了 Java 内存不足错误。但是,我可以通过在脚本中添加以下行来分配更多内存:
conf=SparkConf()
conf.set("spark.driver.memory", "4g")
Run Code Online (Sandbox Code Playgroud)
这是我用来启动 Spark 的 Python 脚本的完整示例:
import os
import sys
import glob
spark_home = '<DIRECTORY WHERE SPARK FILES EXIST>/spark-2.0.0-bin-hadoop2.7/'
driver_home = '<DIRECTORY WHERE DRIVERS EXIST>'
if 'SPARK_HOME' not in os.environ:
os.environ['SPARK_HOME'] = spark_home
SPARK_HOME = os.environ['SPARK_HOME']
sys.path.insert(0,os.path.join(SPARK_HOME,"python"))
for lib in glob.glob(os.path.join(SPARK_HOME, "python", "lib", "*.zip")):
sys.path.insert(0,lib);
from pyspark import SparkContext
from pyspark import SparkConf
from pyspark.sql import SQLContext
conf=SparkConf()
conf.set("spark.executor.memory", "4g")
conf.set("spark.driver.memory", "4g")
conf.set("spark.cores.max", "2")
conf.set("spark.driver.extraClassPath",
driver_home+'/jdbc/postgresql-9.4-1201-jdbc41.jar:'\
+driver_home+'/jdbc/clickhouse-jdbc-0.1.52.jar:'\
+driver_home+'/mongo/mongo-spark-connector_2.11-2.2.3.jar:'\
+driver_home+'/mongo/mongo-java-driver-3.8.0.jar')
sc = SparkContext.getOrCreate(conf)
spark = SQLContext(sc)
Run Code Online (Sandbox Code Playgroud)
显然,这个问题从来没有说要在本地模式下而不是在纱线上运行。我以某种方式无法使spark-default.conf更改正常工作。相反,我尝试了这个,对我有用
bin/spark-shell --master yarn --num-executors 6 --driver-memory 5g --executor-memory 7g
Run Code Online (Sandbox Code Playgroud)
(无法将执行程序的内存增加到8g,这对纱线配置有一些限制。)
| 归档时间: |
|
| 查看次数: |
122513 次 |
| 最近记录: |