如何停止在函数内部创建的SparkContext?

时间:2019-02-13 11:57:39

标签: apache-spark pyspark

我具有创建SparkContext和SQLContext的功能。

 def init_spark(query=None):
     def quiet_logs( sc ):
       logger = sc._jvm.org.apache.log4j
       logger.LogManager.getLogger("org"). setLevel( logger.Level.ERROR )
       logger.LogManager.getLogger("akka").setLevel( logger.Level.ERROR )

     if 'sc' in locals():
         sc.stop()
     conf = pyspark.SparkConf()
     conf.set("spark.driver.allowMultipleContexts", "true")
     conf.set("es.index.auto.create", "true")
     conf.set("es.nodes.discovery", "true")
     conf.set("es.read.field.exclude", "data.integrations")

     if query:
         conf.set("es.query", query)

     sc = pyspark.SparkContext(conf=conf)
     quiet_logs(sc)

     sqlContext = pyspark.SQLContext(sc)
     return sqlContext

显然sc.stop()检查不起作用,并且我尝试在函数外部执行该操作,但仍然不起作用。

1 个答案:

答案 0 :(得分:0)

也许看一下getOrCreatenewSession,您可以先停止当前的https://www.journaldev.com/12372/android-recyclerview-example和{{3}},然后从config创建一个新的,因此不必进行Python级别的检查。

# Stop whatever you are getting here
SparkSession.builder.getOrCreate().stop()

# New session with your config
spark = SparkSession.builder.config(conf=conf).newSession()
sc = spark.sparkContext

现在第一部分似乎效率很低(如果没有会话,它将创建一个然后杀死它),不确定它会导致多少开销。

编辑:或将sc拉到外面,并检查是否已分配

sc = None

def init_spark(query=None):

  global sc

  if sc is not None:
    sc.stop()

  ...

  sc = pyspark.SparkContext(conf=conf)

  ...