![](/img/trans.png)
[英]Apache Spark Effects of Driver Memory, Executor Memory, Driver Memory Overhead and Executor Memory Overhead on success of job runs
[英]How to set Apache Spark Executor memory
如何增加可用於 Apache Spark 執行器節點的內存?
我有一個適合加載到 Apache Spark 的 2 GB 文件。 我目前在 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.memory
到4g
在$SPARK_HOME/conf/spark-defaults.conf
UI 顯示此變量是在 Spark 環境中設置的。 你可以在這里找到截圖
但是,當我轉到Executor 選項卡時,我的單個 Executor 的內存限制仍然設置為 265.4 MB。 我也仍然遇到同樣的錯誤。
我嘗試了這里提到的各種事情,但我仍然遇到錯誤並且不知道應該在哪里更改設置。
我正在從 spark-shell 交互式地運行我的代碼
正如您所注意到的,由於您在本地模式下運行 Spark,因此設置spark.executor.memory
不會產生任何影響。 這樣做的原因是 Worker “生活”在您啟動spark-shell時啟動的驅動程序 JVM 進程中,並且用於該進程的默認內存為512M 。 您可以通過將spark.driver.memory
設置為更高的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 內存緩存的數量時接管。
另請注意,對於本地模式,您必須在啟動 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
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)
顯然,這個問題從來沒有說在本地模式上運行而不是在紗線上運行。 不知何故,我無法讓 spark-default.conf 更改工作。 相反,我嘗試了這個,它對我有用
bin/spark-shell --master yarn --num-executors 6 --driver-memory 5g --executor-memory 7g
(無法將執行程序內存提升到 8g,紗線配置有一些限制。)
據我所知,不可能在運行時更改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
環境變量
在 spark/conf 目錄中創建一個名為 spark-env.sh 的文件並添加這一行
SPARK_EXECUTOR_MEMORY=2000m #memory size which you want to allocate for the executor
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
您可以使用以下示例構建命令
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"
根據驅動程序給出的指令運行 Spark 任務需要 Spark 執行器內存。 基本上,它需要更多資源,這取決於您提交的作業。
Executor 內存包括執行任務所需的內存以及不應大於 JVM 大小和 yarn 最大容器大小的開銷內存。
在 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
您提到您正在 spark-shell 上以交互方式運行您的代碼,因此,如果沒有為驅動程序內存或執行程序內存設置適當的值,那么 spark 默認為其分配一些值,該值基於它的屬性文件(其中默認值為被提及)。
我希望你知道有一個驅動程序(主節點)和工作節點(執行器被創建和處理的地方),所以基本上火花程序需要兩種類型的空間,所以如果你想設置驅動程序內存然后當啟動 spark-shell 時。
spark-shell --driver-memory "your value" 並設置執行程序內存: spark-shell --executor-memory "your value"
那么我認為你很高興使用你希望你的 spark-shell 使用的內存的期望值。
用於為執行程序配置內核和內存。
spark-shell --help
--master MASTER_URL spark://host:port, mesos://host:port, yarn,
--executor-memory MEM 每個執行器的內存(例如 1000M,2G)(默認值:1G)。
--total-executor-cores NUM 所有執行程序的核心總數。
--executor-cores NUM 每個執行程序使用的內核數。 (默認值:YARN 和 K8S 模式下的 1,或獨立模式下工作器上的所有可用內核)。
最終命令:如果您的系統有 6 個內核和 6GB RAM。
案例 1:創建 6 個執行程序,每個執行程序具有 1 個內核和 1GB RAM
spark-shell --master spark://sparkmaster:7077 --executor-cores 1 --executor-memory 1g
案例 2:創建 3 個執行程序,每個執行程序具有 1 個內核和 2GB RAM。 最大內存為 6GB,3 核是理想的。
spark-shell --master spark://sparkmaster:7077 --executor-cores 1 --executor-memory 2g
案例 3:創建 2 個執行程序,每個執行程序具有 3 個內核和 3GB RAM。 使用所有 RAM 和內核
spark-shell --master spark://sparkmaster:7077 --executor-cores 3 --executor-memory 3g
案例 4:創建 2 個執行程序,每個執行程序具有 3 個內核和僅 1GB RAM。
spark-shell --master spark://sparkmaster:7077 --executor-cores 3 --executor-memory 1g
案例 5:如果我們只想使用 1 個內核和 1GB RAM 的執行器
spark-shell --master spark://sparkmaster:7077 --total-executor-cores 1 --executor-cores 1 --executor-memory 1g
案例 6:如果我們只想使用兩個 executor,每個 1 核和 1GB RAM
spark-shell --master spark://sparkmaster:7077 --total-executor-cores 2 --executor-cores 1 --executor-memory 1g
CASE 7:如果我們只想使用兩個 executor,每一個 2 個內核和 2GB RAM(總共 4 個內核和 4GB RAM)
spark-shell --master spark://sparkmaster:7077 --total-executor-cores 4 --executor-cores 2 --executor-memory 2g
案例8:如果我們應用--total-executor-cores 2,那么只會創建一個執行器。
spark-shell --master spark://sparkmaster:7077 --total-executor-cores 4 --executor-cores 2 --executor-memory 2g
CASE 9 : Total executor cores: 3 不能被每個 executor 的 cores 整除:2,左邊的 cores: 1 不會被分配。 將創建一個具有 2 個核心的執行程序。
spark-shell --master spark://sparkmaster:7077 --total-executor-cores 3 --executor-cores 2 --executor-memory 2g
所以 --total-executor-cores / --executor-cores = 將創建的執行程序數量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.