如何设置Apache Spark执行器内存


127

如何增加可用于Apache Spark执行器节点的内存?

我有一个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.

我看了看文档,这里并设置spark.executor.memory4g$SPARK_HOME/conf/spark-defaults.conf

UI显示该变量在Spark环境中设置。你可以在这里找到截图

但是,当我转到“ 执行器”选项卡时,单个执行器的内存限制仍然设置为265.4 MB。我也仍然遇到相同的错误。

我尝试了这里提到的各种方法但是仍然出现错误,并且不清楚应该在哪里更改设置。

我正在从spark-shell交互式运行我的代码

Answers:


185

由于您已经在本地模式下运行Spark,因此设置spark.executor.memory不会产生任何影响。这样做的原因是,在启动spark-shell时,Worker在启动的驱动程序JVM进程中“存在”,并且默认的内存为512M。您可以通过将其设置spark.driver.memory为更高的值(例如5g)来增加该值。您可以通过以下任一方法来做到这一点:

  • 在属性文件中进行设置(默认为$SPARK_HOME/conf/spark-defaults.conf),

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

    $ ./bin/spark-shell --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

因此请注意,并非所有驱动程序内存都可用于RDD存储。

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


1
5g等于5Gb吗?
查克

@ Chuckspark.apache.org/ docs/ latest/… “用于驱动程序进程的内存量,即SparkContext的初始化位置,其格式与带有大小单位后缀(“ k”,“ m “,“ g”或“ t”)(例如512m,2g)。”
詹姆斯·摩尔

39

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

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

这将以2G而不是默认的512M启动JVM。
详细信息在这里

对于本地模式,您只有一个执行程序,而该执行程序是您的驱动程序,因此您需要设置驱动程序的内存。*也就是说,在本地模式下,当您运行spark-submit时,已经使用默认内存设置启动了JVM,因此在conf中设置“ spark.driver.memory”实际上不会为您做任何事情。相反,您需要按以下方式运行spark-submit


5

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

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

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


OP确实提到他正在使用一台机器。
Sharique Abdullah,

您使executor-memory高于driver-memory
nimeresam

5

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)

4

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

屏幕截图

随着[ --driver-memory 2G ]的增加,执行程序的内存增加到〜950Mb。 在此处输入图片说明


2

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

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

1
确实,我使用具体配置运行主服务器,每次运行spark命令时都不需要添加选项。但这仅适用于群集节点,如果是独立节点,则设置为SPARK_WORKER_MEMORY
Evhz

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" 

1

根据驱动程序给出的指令,运行火花任务需要Spark执行程序内存。基本上,它需要更多资源,具体取决于您提交的工作。

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

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

spar.executor.cores=1

spark.executor.memory=2g

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

或者,我们可以在运行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

0

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

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

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

那么我认为您最好选择希望您的Spark Shell使用的内存的期望值。


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


0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.