2015-01-03 11 views
5

私は、以下のコマンドを使用してスパーク開発のためiPythonノートを育てた:スパークPythonのパフォーマンス・チューニング

ipython notebook --profile=pyspark 

そして、私はこのようなPythonコードを使用してsc 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をよりよく理解するために

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

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

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

ありがとうございます!

答えて

5

で実行されているすべてのプロセスの累積メモリがその上限を超えないことを意味しますか?

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

しかし、この設定については、YARNで扱いにくいことがあります。 YARNは蓄積されたメモリをspark.executor.memoryに制限し、SparkはエクゼキュータJVMに同じ制限を使用します。そのような制限でPython用のメモリがないため、YARN制限をオフにしなければなりませんでした。

あなたのスタンドアロンのスパーク設定に従った正直な回答: いいえ、spark.executor.memoryは、Pythonのメモリ割り当てを制限しません。

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

この場合、可能な限り高い数値に設定する必要がありますか?

平衡番号に設定する必要があります。 JVMの特有の機能があります。最終的にspark.executor.memoryを割り当て、決してそれを解放しません。 spark.executor.memoryTOTAL_RAM/EXECUTORS_COUNTに設定することはできません。Javaのためにすべてのメモリが必要です。私の環境では

、私は0.6 * spark.executor.memoryがスパークキャッシュによって使用されることを意味spark.executor.memory=(TOTAL_RAM/EXECUTORS_COUNT)/1.50.4 * spark.executor.memory使用 - Pythonが - エグゼキュータのJVM、および0.5 * spark.executor.memoryを。

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

+0

2番目から最後の段落を明確にしてください。あなたは0.6、0.4、特に0.5のpython計算にどうやって来たのですか? – javadba

+0

@javadba、0.6はspark.storage.memoryFraction(デフォルト、https://spark.apache.org/docs/1.3.0/configuration.html)です。 Pythonの場合は0.4が(1 - 0.6)、Pythonの場合0.5が私の使用例への私の期待です(最悪の場合、Pythonのメモリ使用量は0.6 * 2と予想されるので、0.5は私の環境の純粋な経験値です) 。 –

+0

numpyといくつかのPythonマシンでネイティブコードを使用するライブラリを学習することを考えてみましょう。すべてのメモリはspark.executor.memoryから来ますか?または、O/Sのスパークの外側から来ますか?ありがとう! – javadba

0

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

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

Spark.driver.memoryもチェックして、Sparkから大量のデータが返されることを期待してください。

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

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

関連する問題