簡體   English   中英

如何設置 Apache Spark Executor 內存

[英]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.memory4g$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,紗線配置有一些限制。)

您需要增加驅動程序內存。在mac上(即在本地master上運行時),默認驅動程序內存為1024M)。 默認情況下,因此 380Mb 分配給執行程序。

截屏

增加 [ --driver-memory 2G ] 后,執行程序內存增加到 ~950Mb。 在此處輸入圖片說明

據我所知,不可能在運行時更改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 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

您提到您正在 spark-shell 上以交互方式運行您的代碼,因此,如果沒有為驅動程序內存或執行程序內存設置適當的值,那么 spark 默認為其分配一些值,該值基於它的屬性文件(其中默認值為被提及)。

我希望你知道有一個驅動程序(主節點)和工作節點(執行器被創建和處理的地方),所以基本上火花程序需要兩種類型的空間,所以如果你想設置驅動程序內存然后當啟動 spark-shell 時。

spark-shell --driver-memory "your value" 並設置執行程序內存: spark-shell --executor-memory "your value"

那么我認為你很高興使用你希望你的 spark-shell 使用的內存的期望值。

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

spark-shell --driver-memory 2G

在此處輸入圖片說明

用於為執行程序配置內核和內存。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM