2015-02-01 26 views
5

Konsolda birden çok SparkContext oluşturmak istiyorum. mailing list'daki bir gönderiye göre, SparkConf.set ('spark.driver.allowMultipleContexts', true) yapmam gerekiyor, makul görünüyor ama işe yaramaz. Bu konuda tecrübesi olan var mı? çok teşekkürler:Konsolda birden çok SparkContexts oluşturma

feryat yapmak olduğunu ve hata mesajı, bir ipython Notebook o yaptı:

from pyspark import SparkConf, SparkContext 
conf = SparkConf().setMaster("spark://10.21.208.21:7077").set("spark.driver.allowMultipleContexts", "true") 
conf.getAll() 
[(u'spark.eventLog.enabled', u'true'), 
(u'spark.driver.allowMultipleContexts', u'true'), 
(u'spark.driver.host', u'10.20.70.80'), 
(u'spark.app.name', u'pyspark-shell'), 
(u'spark.eventLog.dir', u'hdfs://10.21.208.21:8020/sparklog'), 
(u'spark.master', u'spark://10.21.208.21:7077')] 

sc1 = SparkContext(conf=conf.setAppName("app 1")) ## this sc success 
sc1 
<pyspark.context.SparkContext at 0x1b7cf10> 

sc2 = SparkContext(conf=conf.setAppName("app 2")) ## this failed 
ValueError        Traceback (most recent call last) 
<ipython-input-23-e6dcca5aec38> in <module>() 
----> 1 sc2 = SparkContext(conf=conf.setAppName("app 2")) 

/usr/local/spark-1.2.0-bin-cdh4/python/pyspark/context.pyc in __init__(self, master, appName, sparkHome, pyFiles, environment, batchSize, serializer, conf, gateway, jsc) 
    100   """ 
    101   self._callsite = first_spark_call() or CallSite(None, None, None) 
--> 102   SparkContext._ensure_initialized(self, gateway=gateway) 
    103   try: 
    104    self._do_init(master, appName, sparkHome, pyFiles, environment, batchSize, serializer, 

/usr/local/spark-1.2.0-bin-cdh4/python/pyspark/context.pyc in _ensure_initialized(cls, instance, gateway) 
    226       " created by %s at %s:%s " 
    227       % (currentAppName, currentMaster, 
--> 228        callsite.function, callsite.file, callsite.linenum)) 
    229     else: 
    230      SparkContext._active_spark_context = instance 

ValueError: Cannot run multiple SparkContexts at once; existing SparkContext(app=app 1, master=spark://10.21.208.21:7077) created by __init__ at <ipython-input-21-fb3adb569241>:1 

cevap

3

Bu (spark.driver.allowMultipleContexts yapılandırma eklenmemiş önce var bir PySpark özgü sınırlama olan bir JVM içindeki birden çok SparkContext nesnesine ilişkindir). PySpark, birden fazla aktif SparkContext'a izin vermez, çünkü uygulamasının çeşitli kısımları, bazı bileşenlerin global paylaşılmış duruma sahip olduğunu varsayar.

+0

oluşturmadan önce körük buradaki görevi https://github.com/apache/spark/pull/3121, SPARK-2243 hala çözülemediğinden, spark.driver.allowMultipleContexts istisna olarak (test yapmayı desteklemek için) ve çoklu bağlamların kullanımından vazgeçilmiş gibi görünüyor. SparkContext koduna bakarak, sadece bir aktif SparkContext olabilir, bu yüzden bu sadece PySpark'a özgü sınırlama değildir. Yoksa yanılıyor muyum? – pzecevic

+1

@pzecevic, bu doğru: teknik olarak, Spark yalnızca tek bir aktif SparkContext'i destekliyor. PySpark'ın bunun için her zaman bir hata mesajı vardı, ancak Scala/Java Spark resmi olarak desteklenmemiş olsa bile birden fazla etkin içerik oluşturmanızı engellemezdi. Bazı durumlarda birden fazla aktif içerik çalışabilir, _by accident_, bu yüzden yeni konfigürasyonu geçici bir çıkış kapağı olarak ekledik ve testte kullanmak için; kullanıcılar genellikle bu bayrağı etkinleştirmemelidir, çünkü hata denetimini yalnızca devre dışı bırakır ve aslında çoklu bağlamlar için uygun desteği etkinleştirmez. –

+0

Tamam, açıklama için teşekkürler. Bana öyle geliyor ki, cevabınız biraz yanıltıcıdır ... Bu PySpark'a özgü bir sınırlama değildir ve charles.li birden fazla bağlamı kullanmaya çalışmamayı denemedi (uygun destek eklenene kadar) – pzecevic

3

Önceki kıvılcım bağlamının kapatılmasını ve kapatılmasını() stop() ile kapatılacağını ve yenisinin yeniden oluşturulabileceğini umuyordum ama yine de aynı hatayı alıyor.

1

Benim yöntemim:

from pyspark import SparkContext 
try: 
    sc.stop() 
except: 
    pass 
sc=SparkContext('local','pyspark') 
''' 
your code 
''' 
sc.stop() 
+0

etrafında çalışılabilir. Bunun yerine 'NameError:' dışında kullanmalısınız. Tamamen farklı bir istisna alırsanız ve sessizce baypas ederseniz ne olur? – Pithikos

0

çalıştırın yorumlarınıza göre yeni bir bağlam

def kill_current_spark_context(): 
    SparkContext.getOrCreate().stop() 
İlgili konular