2015-02-01 4 views
5

콘솔에 둘 이상의 SparkContext를 만들고 싶습니다. mailing list의 게시물에 따르면 SparkConf.set ('spark.driver.allowMultipleContexts', true)를 수행해야하는데 합리적인 것 같지만 작동하지 않습니다. 누구든지이 경험을 할 수 있습니까? 덕분에 많은 :콘솔에 여러 개의 SparkContext를 만드는 방법

를 넣고 내가 할 것입니다 및 오류 메시지가, 나는 Ipython 노트북에 있음을했다 :

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 

답변

3

이합니다 (spark.driver.allowMultipleContexts 구성이 추가되기 전에 존재했던 PySpark 별 제한되는 JVM 내의 여러 SparkContext 객체와 관련됨). PySpark는 구현의 여러 부분이 특정 구성 요소가 전역 공유 상태라고 가정하기 때문에 여러 활성 SparkContext를 허용하지 않습니다.

+0

을 만들기 전에 우는 기능 여기 https://github.com/apache/spark/pull/3121, spark.driver.allowMultipleContexts가 (테스트를 지원하기 위해) 예외로 추가되었으며 SPARK-2243이 여전히 해결되지 않았기 때문에 여러 컨텍스트의 사용이 권장되지 않는 것 같습니다. SparkContext 코드를 살펴보면 활성 SparkContext가 하나만있을 수 있으므로 PySpark 관련 제한 사항이 아닙니다. 아니면 내가 틀렸어? – pzecevic

+1

@pzecevic 맞습니다. 기술적으로 Spark는 단 하나의 활성 SparkContext 만 지원합니다. PySpark는 항상 이것에 대한 에러 메시지를 가지고 있지만, 공식적으로 지원되지는 않았지만 Scala/Java Spark이 여러 활성 컨텍스트를 생성하는 것을 막지는 못합니다. 어떤 경우에는 여러 개의 활성 컨텍스트가 작동 할 수도 있습니다. 따라서 새로운 구성을 임시 탈출구로 추가하여 테스트에 사용합니다. 사용자는 일반적으로 오류 검사 만 비활성화하고 실제로 다중 컨텍스트에 대한 적절한 지원을 활성화하지 않기 때문에 일반적으로 해당 플래그를 활성화해서는 안됩니다. –

+0

확인해 주셔서 감사합니다. 그때 당신의 대답은 약간 오도하는 것 같습니다 ... 이것은 PySpark에 특정한 제한이 아니며 charles.li는 다중 컨텍스트를 전혀 사용하지 않습니다 (적절한 지원이 추가 될 때까지) – pzecevic

3

나는 이전의 spark context가 close() stop()을 호출하여 멈추고 닫히기를 바랬다. 새로운 것이 다시 생성 될 수 있지만 여전히 같은 오류가 발생한다.

1

내 방법 :

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

대신 'except NameError :'를 사용해야합니다. 완전히 다른 예외를 가져 와서 자동으로 무시하면 어떨까요? – Pithikos

0

실행 귀하의 의견에 따라 새로운 상황

def kill_current_spark_context(): 
    SparkContext.getOrCreate().stop()