Apache Spark Executorメモリを設定する方法


127

Apache spark executorノードで使用可能なメモリーを増やすにはどうすればよいですか?

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]タブに移動しても、1つのExecutorのメモリ制限が265.4 MBに設定されています。私はまだ同じエラーが出ます。

ここで述べさまざまなことを試してみましたが、それでもエラーが発生し、設定をどこで変更すればよいか明確にわかりません。

スパークシェルからインタラクティブにコードを実行しています

回答:


185

ローカルモードでSparkを実行しspark.executor.memoryているため、お気づきのとおり、設定は効果がありません。この理由は、スパークシェルを開始するときに開始するドライバー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.memorySparkのメモリキャッシュ専用にする量を計算するときに設定が引き継がれます。


1
5gは5Gbと同等ですか?
チャック

@ Chuckspark.apache.org / docs / latest / 「ドライバープロセスに使用するメモリの量。つまり、SparkContextが初期化される場所。サイズ単位のサフィックス( "k"、 "m "、" g "または" t ")(例:512m、2g)。"
James Moore

39

また、ローカルモードの場合は、jvmを開始する前にドライバーメモリの量を設定する必要があることに注意してください。

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

これにより、デフォルトの512Mではなく2GでJVMが起動します。
詳細はこちら

ローカルモードの場合、エグゼキューターは1つだけで、このエグゼキューターはドライバーなので、代わりにドライバーのメモリを設定する必要があります。*とはいえ、ローカルモードでは、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

(executor-memoryを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 2018年

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タスクを実行するには、Spark executorメモリーが必要です。基本的に、送信されたジョブに応じて、より多くのリソースが必要になります。

エグゼキューターメモリには、タスクの実行に必要なメモリに加えて、JVMのサイズと最大コンテナーサイズを超えないオーバーヘッドメモリが含まれます。

spark-defaults.confに以下のパラメーターを追加します

spar.executor.cores=1

spark.executor.memory=2g

cloudera manageramabariなどのクラスター管理ツールを使用している場合は、クラスター構成を更新して、最新の構成をクラスター内のすべてのノードに反映してください。

または、spark-submitクラスとアプリケーションパスと共にコマンドを実行するときに、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

0

あなたはspark-shellでコードをインタラクティブに実行していると述べましたが、ドライバーメモリまたはエグゼキューターメモリに適切な値が設定されていない場合、sparkはデフォルトでそのプロパティファイルに基づいたいくつかの値を割り当てます(デフォルト値は言及されている)。

ドライバー(マスターノード)とワーカーノード(エグゼキューターが作成および処理される場所)が1つあるため、sparkプログラムには基本的に2種類のスペースが必要なので、設定したい場合は、その後、ドライバメモリがspark-shellを開始したとき。

spark-shell --driver-memory "your value"とexecutorメモリーを設定するには:spark-shell --executor-memory "your value"

次に、スパークシェルで使用するメモリの望ましい値を使用するのがよいと思います。


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_VERSIONSparkの最新リリースバージョンに関して環境変数を適切に変更してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.