2016-06-23 18 views
5

programında ayarlayın. Bağımsız bir komut dosyası yazmak için, bir Spark içeriğini doğrudan Python'dan başlatmak ve yapılandırmak istiyorum. PySpark senaryosunu kullanma Birlikte sürücü bellek boyutunu ayarlayabilirsiniz:Programın bellek boyutunu PySpark

$ /opt/spark-1.6.1/bin/pyspark 
... INFO MemoryStore: MemoryStore started with capacity 511.5 MB ... 
$ /opt/spark-1.6.1/bin/pyspark --conf spark.driver.memory=10g 
... INFO MemoryStore: MemoryStore started with capacity 7.0 GB ... 

Ama Python modülünden bağlamı başlatırken, sürücü bellek boyutu ayarlanamaz:

$ export SPARK_HOME=/opt/spark-1.6.1                                                                             
$ export PYTHONPATH=$PYTHONPATH:$SPARK_HOME/python 
$ python 
>>> from pyspark import SparkConf, SparkContext 
>>> sc = SparkContext(conf=SparkConf().set('spark.driver.memory', '10g')) 
... INFO MemoryStore: MemoryStore started with capacity 511.5 MB ... 

bildiğim tek çözüm sparks-default.conf'da spark.driver.memory'u ayarlamaktır, bu da tatmin edici değildir. this post'da açıklandığı gibi, JVM başlatıldıktan sonra Java/Scala'nın sürücünün bellek boyutunu değiştirememesi mantıklıdır. Bir şekilde Python'dan pyspark modülünü almadan önce veya aktarırken dinamik olarak bir şekilde yapılandırmanın bir yolu var mı?

cevap

6

Konfeti, kullandığınız gibi kullanmanın bir anlamı yok. Kodunuza bu önsöz eklemeyi deneyin:

memory = '10g' 
pyspark_submit_args = ' --driver-memory ' + memory + ' pyspark-shell' 
os.environ["PYSPARK_SUBMIT_ARGS"] = pyspark_submit_args 
0

Eğer --driver bellek bayrağını kullanarak kıvılcım göndermek komutu aracılığıyla geçebilir.

spark-submit \ 
    --master yarn \ 
    --deploy-mode cluster \ 
    --driver-cores 12 --driver-memory 20g \ 
    --num-executors 52 --executor-cores 6 --executor-memory 30g MySparkApp.py 

dinamik değiştirebilir bir değişken diğer yerine (elle ayarlanıyor sürücüleri bellek) veya bir kabuk komut dosyası bu yukarıdaki komutu var.

2

Ben de aynı sorunu yaşadım ve bunu yapmak için hacky bir yol buldum. Ve aynı yaklaşımı alan there is an existing answer çıkıyor. Ama neden çalıştığını açıklayacağım.

Bildiğiniz gibi, sürücü belleği after the JVM starts olarak ayarlanamaz. Bir SparkContext oluştururken Ama pyspark calling spark-submit and passing in pyspark-shell as the command

SPARK_HOME = os.environ["SPARK_HOME"] 
# Launch the Py4j gateway using Spark's run command so that we pick up the 
# proper classpath and settings from spark-env.sh 
on_windows = platform.system() == "Windows" 
script = "./bin/spark-submit.cmd" if on_windows else "./bin/spark-submit" 
submit_args = os.environ.get("PYSPARK_SUBMIT_ARGS", "pyspark-shell") 
if os.environ.get("SPARK_TESTING"): 
    submit_args = ' '.join([ 
     "--conf spark.ui.enabled=false", 
     submit_args 
    ]) 
command = [os.path.join(SPARK_HOME, script)] + shlex.split(submit_args) 

Bildirimi PYSPARK_SUBMIT_ARGS ortam değişkeni tarafından JVM başlar. Bunlar, içeriğin spark-submit komutuna göndereceği argümanlardır.

Yani sürece önce PYSPARK_SUBMIT_ARGS="--driver-memory=2g pyspark-shell" belirtilen yeni SparkContext, sürücü bellek ayarı yürürlüğe girmesi halinde örneğini. Bu ortam değişkenini belirlemenin birden fazla yolu vardır, bir yöntem için daha önce bağlandığım cevaba bakın.

+0

Gerçek kodla nasıl çalıştığını açıkladığınız için çok teşekkürler! Diğer cevabı daha önce çalıştığı ve gönderildiği gibi kabul ettim. – udscbt

+0

@udscbt Endişelenme yok. Sonunda anladığımda çok heyecanlandım ve kendi sorularımı/cevabımı (insanların bilmesi gerekenler) yayınlayacaktım. Bulduğum diğer tüm sorular, "gönder-atla-hafızayı gönder-gönder" yazıyordu, ama kıvılcım göndermiyordum (bu yüzden düşündüm). – FGreg