如何设置 ApacheSpark 执行器内存

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

我有一个2GB 的文件,适合加载到 ApacheSpark。我在一台机器上运行阿帕奇火花,所以驱动程序和执行程序在同一台机器上。这台机器有8GB 的内存。

当我在设置文件缓存在内存中后尝试计算文件的行数时,我会得到以下错误:

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_HOME/conf/spark-defaults.conf中将 spark.executor.memory设置为 4g

UI 显示这个变量是在 Spark Environment 中设置的

但是,当我转到 执行标签时,我的单个 Execator 的内存限制仍然被设置为265.4 MB。我仍然得到相同的错误。

我尝试了各种提到的 给你的东西,但我仍然得到错误,并没有一个清楚的想法,我应该改变设置。

我正在火花壳程序中交互式地运行我的代码

229892 次浏览

由于您在本地模式下运行 Spark,因此设置 spark.executor.memory不会产生任何效果,正如您已经注意到的那样。这样做的原因是,Worker“存在于”启动 火花弹时启动的驱动程序 JVM 进程中,而该进程使用的默认内存是 512M。您可以通过将 spark.driver.memory设置为更高的值(例如 5G)来增加这个值。你可以这样做:

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

    spark.driver.memory              5g
    
  • or by supplying configuration setting at runtime

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

Note that this cannot be achieved by setting it in the application, because it is already too late by then, the process has already started with some amount of memory.

The reason for 265.4 MB is that Spark dedicates spark.storage.memoryFraction * spark.storage.safetyFraction to the total amount of storage memory and by default they are 0.6 and 0.9.

512 MB * 0.6 * 0.9 ~ 265.4 MB

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

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

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

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

这将使用2G 启动 JVM,而不是默认的512M。
详情 给你:

对于本地模式,您只有一个执行器,并且这个执行器是您的驱动程序,因此您需要设置驱动程序的内存。* 也就是说,在本地模式下,当您运行 park-commit 时,JVM 已经启动了默认的内存设置,因此在 conf 中设置“ parks. driver.memory”实际上不会为您做任何事情。相反,您需要像下面这样运行 park-mit

显然,问题从来没有说运行在本地模式,而不是纱。不知怎么的,我不能得到火花默认。保证变更到工作状态。相反,我尝试了这种方法,它对我很有效

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

(不能将执行器存储器提高到8g,纱线配置有一定的限制。)

在 park/conf 目录中创建一个名为 park-env.sh 的文件,然后 加上这一行

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

可以使用以下示例生成命令

 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"

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

Screenshot

随着[ 驱动内存2G]的增加,执行者内存增加到 ~ 950Mb。 enter image description here

火花执行器内存是必需的运行您的火花任务的基础上,由您的驱动程序给出的指示。基本上,它需要更多的资源,这取决于您提交的作业。

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

在 park-default. conf 中添加以下参数

spar.executor.cores=1


spark.executor.memory=2g

如果您使用任何集群管理工具,如 Cloudera 经理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

你提到过你是在 park-shell 上交互式地运行你的代码,所以,如果没有为驱动程序或执行程序内存设置合适的值,那么就默认地给它赋一些值,这是基于它的属性文件(其中提到了默认值)。

我希望您能意识到这样一个事实,即存在一个驱动程序(主节点)和工作节点(执行程序在其中被创建和处理) ,所以火花程序基本上需要两种类型的空间,所以如果您想设置驱动程序内存,那么在启动火花 shell 时。

Park-shell ——驱动程序内存“ your value”和设置执行程序内存: 火花弹——执行者——记忆“你的价值”

那么我认为你可以选择你希望你的火花弹使用的内存的期望值。

格雷格提交的答案帮助我解决了我的问题。我从 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)
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

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

spark-shell --driver-memory 2G

enter image description here

据我所知,不可能在运行时更改 spark.executor.memory。如果您正在运行一个独立的版本,使用 pypark 和图形框架,您可以通过执行以下命令来启动 pypark REPL:

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

一定要适当改变 SPARK_VERSION的环境变量,关于最新发布的 Spark 版本

为执行器配置内核和内存。

spark-shell --help


--master MASTER_URL spark://host:port, mesos://host:port, yarn,


--executor-memory MEM Memory per executor (e.g. 1000M, 2G) (Default: 1G).


--total-executor-cores NUM Total cores for all executors.


--executor-cores NUM Number of cores used by each executor. (Default: 1 in YARN and K8S modes, or all available cores on the worker in standalone mode).

如果您的系统有6个内核和6GB 内存,请选择以下命令之一:

  1. 创建6个执行器,每个执行器有1个核心和1 GB 内存
spark-shell --master spark://sparkmaster:7077 --executor-cores 1 --executor-memory 1g
  1. 创建3个执行器,每个1核心和2 GB 内存。最大内存是6 GB,3核心是理想的。
spark-shell --master spark://sparkmaster:7077 --executor-cores 1 --executor-memory 2g
  1. 创建2个执行器,每个3内核和3 GB 内存。使用所有内存和核心
spark-shell --master spark://sparkmaster:7077 --executor-cores 3 --executor-memory 3g
  1. 创建2个执行器,每个执行器3个核心,只有1 GB 内存。
spark-shell --master spark://sparkmaster:7077 --executor-cores 3 --executor-memory 1g
  1. 如果我们只想使用一个执行器与1核心和1GB 内存
spark-shell --master spark://sparkmaster:7077 --total-executor-cores 1 --executor-cores 1 --executor-memory 1g
  1. 如果我们希望只使用两个执行器,每个1核和1GB 内存
spark-shell --master spark://sparkmaster:7077 --total-executor-cores 2 --executor-cores 1 --executor-memory 1g
  1. 如果我们只想使用两个执行器,每个2内核和2 GB 内存(总共4个内核和4 GB 内存)
spark-shell --master spark://sparkmaster:7077 --total-executor-cores 4 --executor-cores 2 --executor-memory 2g
  1. 如果我们应用—— total-Executive-core 2,那么将只创建一个遗嘱执行者。
spark-shell --master spark://sparkmaster:7077 --total-executor-cores 4 --executor-cores 2 --executor-memory 2g
  1. 总的执行器核心: 3不能被每个执行器的核心整除: 2,左边的核心: 1不会被分配。一个具有两个核心的执行器将创建。
spark-shell --master spark://sparkmaster:7077 --total-executor-cores 3 --executor-cores 2 --executor-memory 2g

所以 --total-executor-cores/--executor-cores = 将要创建的执行器的数量。