Ho il seguente foglio di lavoro in IntelliJ:duplicato contesto Spark con IntelliJ nel foglio di lavoro
import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkConf, SparkContext}
/** Lazily instantiated singleton instance of SQLContext */
object SQLContextSingleton {
@transient private var instance: SQLContext = _
def getInstance(sparkContext: SparkContext): SQLContext = {
if (instance == null) {
instance = new SQLContext(sparkContext)
}
instance
}
}
val conf = new SparkConf().
setAppName("Scala Wooksheet").
setMaster("local[*]")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val df = sqlContext.read.json("/Users/someuser/some.json")
df.show
Questo codice funziona nel REPL, ma sembra funzionare solo la prima volta (con alcuni altri errori). Ogni volta successiva, l'errore è:
16/04/13 11:04:57 WARN SparkContext: Another SparkContext is being constructed (or threw an exception in its constructor). This may indicate an error, since only one SparkContext may be running in this JVM (see SPARK-2243). The other SparkContext was created at:
org.apache.spark.SparkContext.<init>(SparkContext.scala:82)
Come posso trovare il contesto già in uso?
Nota: ho sentito altri dire di utilizzare conf.set("spark.driver.allowMultipleContexts","true")
ma questa sembra essere una soluzione di aumento dell'utilizzo della memoria (come spazzatura non raccolta).
C'è un modo migliore?
Penso che se si aggiunge 'sc.close()', come l'ultima riga nel foglio di lavoro, sarete OK - ogni esecuzione creerebbe uno SparkContext e chiuderlo, quindi non ci saranno più di una corsa. –
@TzachZohar - Sembra che sc non abbia un metodo vicino. – codeaperature
Oops, significa 'stop()', mi spiace –