6

以下のコマンドを使用して、Spark 開発用の iPython ノートブックを作成しました。

ipython notebook --profile=pyspark

そして、sc次のような Python コードを使用して SparkContext を作成しました。

import sys
import os
os.environ["YARN_CONF_DIR"] = "/etc/hadoop/conf"
sys.path.append("/opt/cloudera/parcels/CDH/lib/spark/python")
sys.path.append("/opt/cloudera/parcels/CDH/lib/spark/python/lib/py4j-0.8.1-src.zip")
from pyspark import SparkContext, SparkConf
from pyspark.sql import *

sconf = SparkConf()
conf = (SparkConf().setMaster("spark://701.datafireball.com:7077")
    .setAppName("sparkapp1")
    .set("spark.executor.memory", "6g"))
sc = SparkContext(conf=conf)
sqlContext = SQLContext(sc)

spark.executor.memoryドキュメントの をよりよく理解したい

JVM メモリ文字列と同じ形式で、executor プロセスごとに使用するメモリの量

これは、1 つのノードで実行されているすべてのプロセスの累積メモリがその上限を超えないということですか? その場合、その数値をできるだけ高い数​​値に設定する必要がありますか?

これはいくつかのプロパティのリストでもあります。パフォーマンスを向上させるためにデフォルトから微調整できるパラメータが他にもあります。

ありがとう!

4

2 に答える 2

6

これは、1 つのノードで実行されているすべてのプロセスの累積メモリがその上限を超えないということですか?

はい、Spark を YARN クライアント モードで使用する場合、それ以外の場合は JVM のみを制限します。

ただし、YARN でのこの設定にはトリッキーなことがあります。YARN は累積メモリを に制限しspark.executor.memory、Spark はエグゼキュータ JVM に同じ制限を使用します。そのような制限には Python のメモリがありません。そのため、YARN 制限をオフにする必要がありました。

スタンドアロンの Spark 構成に応じた質問に対する正直な答えについては、いいえ、spark.executor.memoryPython のメモリ割り当てを制限しません。

ところで、オプションを SparkConf に設定しても、Spark スタンドアロン エグゼキュータは既に起動しているため、何の効果もありません。についてもっと読むconf/spark-defaults.conf

その場合、その数値をできるだけ高い数​​値に設定する必要がありますか?

バランスの取れた数値に設定する必要があります。JVM には特定の機能がありますspark.executor.memory。最終的には割り当てられ、解放されることはありません。Java のすべてのメモリを使用するため、 に設定spark.executor.memoryすることはできません。TOTAL_RAM / EXECUTORS_COUNT

私の環境では、Spark キャッシュ、エグゼキュータ JVM、およびPythonで使用される を使用しspark.executor.memory=(TOTAL_RAM / EXECUTORS_COUNT) / 1.5ています。0.6 * spark.executor.memory0.4 * spark.executor.memory0.5 * spark.executor.memory

を調整することもできます。spark.storage.memoryFractionこれは0.6デフォルトです。

于 2015-01-15T16:44:05.767 に答える
1

これは、 1 つのノードで実行されているすべてのプロセスの累積メモリ がその上限を超えないということですか? その場合、その数値をできるだけ高い数​​値に設定する必要がありますか?

いいえ。通常、ノードには複数のエグゼキュータがあります。したがって、spark.executor.memory は、1 つのエグゼキューターが使用できるメモリの量を指定します。

また、Spark から大量のデータが返されることが予想される場合は、spark.driver.memory を確認して調整する必要があります。

はい、Python メモリも部分的にカバーしています。Py4Jコードとして解釈され、JVM で実行される部分。

Spark は内部で Py4Jを使用してコードを Java に変換し、そのまま実行します。たとえば、Spark パイプラインを RDD でラムダ関数として使用している場合、その Python コードは実際には Py4J を介してエグゼキューターで実行されます。一方、 rdd.collect() を実行してから、それをローカルの Python 変数として使用すると、ドライバーの Py4J を介して実行されます。

于 2016-02-05T08:25:13.823 に答える