如何设置Apache Spark Executor内存

时间:2014-10-25 11:50:32

标签: 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.

我查看了文档here并将spark.executor.memory设置为4g中的$SPARK_HOME/conf/spark-defaults.conf

UI显示此变量在Spark环境中设置。您可以找到屏幕截图here

但是当我转到Executor tab时,我的单个Executor的内存限制仍设置为265.4 MB。我还是得到了同样的错误。

我尝试了here提到的各种事情,但我仍然收到错误,并且不清楚我应该在哪里更改设置。

我正在从spark-shell

以交互方式运行我的代码

12 个答案:

答案 0 :(得分:161)

由于您在本地模式下运行Spark,因此您已注意到设置spark.executor.memory不会产生任何影响。这样做的原因是工人"生活"在您启动 spark-shell 时启动的驱动程序JVM进程中,用于此目的的默认内存为 512M 。您可以通过将spark.driver.memory设置为更高的值来增加该值,例如 5g 。你可以通过以下任何一种方式做到这一点:

  • 在属性文件中设置它(默认为spark-defaults.conf),

    spark.driver.memory              5g
    
  • 或在运行时提供配置设置

    $ ./bin/spark-shell --driver-memory 5g
    

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

265.4 MB 的原因是Spark dedicates spark.storage.memoryFraction * spark.storage.safetyFraction占存储内存总量,默认情况下为0.6和0.9。

512 MB * 0.6 * 0.9 ~ 265.4 MB

请注意,并非整个驱动程序内存都可用于RDD存储。

但是,当您开始在群集上运行此功能时,spark.executor.memory设置将在计算专用于Spark内存缓存的数量时接管。

答案 1 :(得分:34)

另请注意,对于本地模式,您必须在启动jvm之前设置驱动程序内存量:

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

这将以2G而不是默认的512M启动JVM 详情here

  

对于本地模式,您只有一个执行程序,并且此执行程序是您的驱动程序,因此您需要设置驱动程序的内存。 *那就是说,在本地模式下,当你运行spark-submit时,一个JVM已经启动了默认的内存设置,所以设置" spark.driver.memory"在你的conf中,你真的为你做了什么。相反,您需要按如下方式运行spark-submit

答案 2 :(得分:4)

显然,问题永远不会说本地模式而不是纱线。不知怎的,我无法让spark-default.conf改变工作。相反,我试过这个,它对我有用

bin/spark-shell --master yarn --num-executors 6  --driver-memory 5g --executor-memory 7g

(无法将执行程序内存减少到8g,因此纱线配置存在一些限制。)

答案 3 :(得分:3)

您需要增加驱动程序内存。在Mac上(即在本地主服务器上运行时),默认驱动程序内存为1024M)。默认情况下,380Mb被分配给执行者。

Screenshot

增加[ - driver-memory 2G ]后,执行程序内存增加到~950Mb。 enter image description here

答案 4 :(得分:1)

在spark / conf目录中创建一个名为spark-env.sh的文件 添加此行

SPARK_EXECUTOR_MEMORY=2000m #memory size which you want to allocate for the executor

答案 5 :(得分:1)

您可以使用以下示例构建命令

 spark-submit    --jars /usr/share/java/postgresql-jdbc.jar    --class com.examples.WordCount3  /home/vaquarkhan/spark-scala-maven-project-0.0.1-SNAPSHOT.jar --jar  --num-executors 3 --driver-memory 10g **--executor-memory 10g** --executor-cores 1  --master local --deploy-mode client  --name wordcount3 --conf "spark.app.id=wordcount" 

答案 6 :(得分:0)

根据驱动程序提供的说明运行spark任务需要Spark执行程序内存。基本上,它需要更多的资源,这取决于您提交的工作。

执行程序内存包括执行任务所需的内存加上开销内存,该内存不应大于JVM和纱线最大容器大小。

在spark-defaults.conf中添加以下参数

spar.executor.cores=1

spark.executor.memory=2g

如果您使用任何群集管理工具,例如 cloudera manager amabari ,请刷新群集配置,以便将最新配置反映到群集中的所有节点。

或者,我们可以在运行spark-submit命令以及类和应用程序路径时将执行程序核心和内存值作为参数传递。

示例:

spark-submit \

  --class org.apache.spark.examples.SparkPi \

  --master yarn \

  --deploy-mode cluster \  # can be client for client mode

  --executor-memory 2G \

  --num-executors 5 \

  /path/to/examples.jar \

  1000

答案 7 :(得分:0)

您提到您是在spark-shell上交互式运行代码,因此,如果没有为驱动程序内存或执行程序内存设置适当的值,那么spark将默认为其分配一些值,这取决于它的属性文件(其中默认值)。

我希望您知道以下事实:存在一个驱动程序(主节点)和工人节点(在其中创建和处理执行程序),因此spark程序基本上需要两种类型的空间,因此如果您想在启动spark-shell时设置驱动程序内存。

spark-shell --driver-memory“您的值”并设置执行程序内存: spark-shell --executor-memory“您的价值”

然后,我认为您最好使用希望您的Spark Shell使用的内存的期望值。

答案 8 :(得分:0)

Grega提交的答案帮助我解决了我的问题。我正在从Docker容器内的python脚本本地运行Spark。最初,在Spark中处理某些数据时,我遇到了Java内存不足错误。但是,我可以通过在脚本中添加以下行来分配更多的内存:

conf=SparkConf()
conf.set("spark.driver.memory", "4g") 

这是我用来启动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)

答案 9 :(得分:0)

spark-submit \

  --class org.apache.spark.examples.SparkPi \

  --master yarn \

  --deploy-mode cluster \  # can be client for client mode

  --executor-memory 2G \

  --num-executors 5 \

  /path/to/examples.jar \

  1000

答案 10 :(得分:0)

在Windows或Linux中,您可以使用以下命令:

spark-shell --driver-memory 2G

enter image description here

答案 11 :(得分:0)

据我所知,在运行时无法更改spark.executor.memory。如果您运行的是带有pyspark和graphframes的独立版本,则可以通过执行以下命令来启动pyspark REPL

pyspark --driver-memory 2g --executor-memory 6g --packages graphframes:graphframes:0.7.0-spark2.4-s_2.11

对于最新发布的Spark版本,请确保适当地更改SPARK_VERSION环境变量