web-dev-qa-db-ja.com

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

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

Apache Sparkにロードするのに適した2 GBのファイルがあります。私は今のところ1台のマシンでApache sparkを実行しているので、ドライバとexecutorは同じマシン上にあります。マシンには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環境で設定されていることを示しています。あなたはスクリーンショットを見つけることができます ここ

ただし、 [エグゼキュータ]タブ に移動しても、1つのエグゼキュータのメモリ制限は265.4 MBに設定されています。私はまだ同じエラーが出ます。

私は言及したいろいろなことを試みました ここ しかし私はまだエラーを得て、そして私が設定を変えるべきであるという明確な考えを持っていません。

私はコードをspark-shellから対話的に実行しています

107
WillamS

Sparkをローカルモードで実行しているので、気づいたようにspark.executor.memoryを設定しても効果はありません。その理由は、Workerが起動時に起動するドライバJVMプロセスspark-Shellの中に "存在"しており、そのために使用されるデフォルトメモリが512Mだからです。 spark.driver.memoryをもっと高い値、例えば5gに設定することでそれを増やすことができます。どちらでもできます。

  • プロパティファイルで設定します(デフォルトは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のメモリキャッシュに割り当てる量を計算するときにspark.executor.memory設定が引き継ぎます。

164
Grega Kešpret

ローカルモードではjvmを起動する前にドライバのメモリ容量を設定する必要があります。

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

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

ローカルモードではエクゼキュータは1つだけで、このエクゼキュータはあなたのドライバなので、代わりにドライバのメモリを設定する必要があります。 *ただし、ローカルモードでは、spark-submitを実行する時点では、JVMはデフォルトのメモリ設定ですでに起動されているので、confに "spark.driver.memory"を設定しても実際には何もしません。代わりに、次のようにspark-submitを実行する必要があります。

35

どうやら、この質問は糸ではなくローカルモードで実行するように言うことはありません。どういうわけか私はspark-default.confの変更を機能させることができませんでした。代わりに私はこれを試してみました、そしてそれは私のために働きました

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

(executor-memoryを8gに増やしても、糸の構成には制限があります。)

4
Somum

ドライバのメモリを増やす必要があります。Mac(ローカルマスタで実行している場合)場合、デフォルトのドライバメモリは1024Mです。したがってデフォルトでは、380Mbがexecutorに割り当てられます。

Screenshot

[ - driver-memory 2G]を増やすと、エグゼキュータのメモリは950MBまで増えました。 enter image description here

3
Sanchay

spark/confディレクトリにspark-env.shというファイルを作成し、この行を追加します。

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

次の例を使用してコマンドを作成できます

 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
vaquar khan

グレガから提出された答えは私が私の問題を解決するのを助けました。 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)
1
Sarah

あなたは自分のコードをspark-shellで対話的に実行しているので、ドライバメモリやexecutorメモリに適切な値が設定されていなければ、プロパティファイルに基づいてデフォルトで何らかの値を割り当てます。言及されている)。

1つのドライバ(マスターノード)とworker-node(エグゼキュータが作成され処理される)があるという事実を知っていることを願っています。そのため、sparkプログラムには基本的に2種類のスペースが必要です。その後、ドライバーのメモリーはspark-shellを起動します。

spark-Shell --driver-memory "your value"とエグゼキュータメモリを設定するには:spark-Shell --executor-memory "your value"

それなら私は、あなたがあなたのspark-shellに使わせたいメモリの望ましい値と一緒に行くのが良いと思います。

0
A.Mishra

スパークエグゼキュータメモリは、ドライバプログラムの指示に基づいてスパークタスクを実行するために必要です。基本的に、それはあなたの提出された仕事に依存するより多くのリソースを必要とします。

エグゼキュータメモリには、タスクの実行に必要なメモリと、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