2016-04-13 16 views
9

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?

+0

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. –

+0

@TzachZohar - Sembra che sc non abbia un metodo vicino. – codeaperature

+0

Oops, significa 'stop()', mi spiace –

risposta

1

Come detectivebag stated in this git post è possibile risolvere questo problema passando i fogli di lavoro per l'esecuzione in solo 'eclipse modalità di compatibilità':

1) Le preferenze aperte

2) sotto Lingue e Frameworks selezionare Scala

3 sotto la scheda del foglio di lavoro deselezionare tutto eccetto "Usa" compatibilità eclissi "modalità"

+0

Qualcuno può contrassegnarlo come risposta plz. – bigdatamann

8

Avevo lo stesso problema nel tentativo di ottenere codice eseguito con Spark in Scala Foglio di lavoro in IntelliJ IDEA (CE 2016.3.4).

La soluzione per la creazione del contesto Spark duplicata era deselezionare la casella di controllo "Esegui foglio di lavoro nel processo di compilazione" in Impostazioni -> Lingue e quadri -> Scala -> Foglio di lavoro. Ho anche testato le altre impostazioni del foglio di lavoro e non hanno avuto alcun effetto sul problema della duplicazione della creazione del contesto Spark.

Inoltre non ho inserito sc.stop() nel foglio di lavoro. Ma ho dovuto impostare i parametri master e appName nel conf affinché funzioni.

ecco la versione foglio di lavoro del codice da SimpleApp.scala da Spark Quick Start

import org.apache.spark.{SparkConf, SparkContext} 

val conf = new SparkConf() 
conf.setMaster("local[*]") 
conf.setAppName("Simple Application") 

val sc = new SparkContext(conf) 

val logFile = "/opt/spark-latest/README.md" 
val logData = sc.textFile(logFile).cache() 
val numAs = logData.filter(line => line.contains("a")).count() 
val numBs = logData.filter(line => line.contains("b")).count() 

println(s"Lines with a: $numAs, Lines with b: $numBs") 

ho usato lo stesso simple.sbt dalla guida per l'importazione le dipendenze per IntelliJ IDEA.

Ecco uno screenshot del funzionamento Scala foglio di lavoro con Spark: a screenshot of the functioning Scala Worksheet with Spark

UPDATE per IntelliJ CE 2.017,1 (foglio di lavoro in modalità REPL)

In 2.017,1 Intellij introdotto modalità REPL per foglio di lavoro. Ho testato lo stesso codice con l'opzione 'Usa REPL' selezionata. Per eseguire questa modalità è necessario lasciare selezionata la casella di controllo "Esegui foglio di lavoro nel processo di compilazione" in Impostazioni foglio di lavoro che ho descritto sopra (è di default).

Il codice funziona correttamente in modalità REPL.

Ecco lo screenshot: Apache Spark running in IntelliJ Scala Worksheet REPL Mode

+3

La soluzione per la creazione del contesto Spark duplicata era deselezionare la casella di controllo "Esegui il foglio di lavoro nel processo di compilazione" in Impostazioni -> Lingue e quadri -> Scala -> Foglio di lavoro. Questo ha funzionato per me. Un altro modo è creare un oggetto Scala semplice e inserire il codice Spark. – jrook

+0

Grazie @jrook mi hai salvato un sacco di tempo (y) – elarib