如何设置Apache Spark Executor内存

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.memory4g$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.你可以通过以下两种方式做到:

请注意,这不能通过在应用程序中设置它来实现,因为到那时已经太晚了,该进程已经开始使用一些内存.

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内存缓存的数量时接管.

  • 5g等于5Gb吗? (4认同)

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)


Som*_*mum 5

显然,这个问题从来没有说要在本地模式下而不是在纱线上运行。我以某种方式无法使spark-default.conf更改正常工作。相反,我尝试了这个,对我有用

bin/spark-shell --master yarn --num-executors 6  --driver-memory 5g --executor-memory 7g
Run Code Online (Sandbox Code Playgroud)

(无法将执行程序的内存增加到8g,这对纱线配置有一些限制。)