2014-05-15 14 views
5

Sto utilizzando spark-ec2 per eseguire un codice Spark. Quando imposto il master su "local", funziona correttamente. Tuttavia, quando imposto il master su $ MASTER, , i worker vengono immediatamente a mancare, con java.lang.NoClassDefFoundError per le classi. Gli addetti si connettono al master e vengono visualizzati nell'interfaccia utente e tentano di eseguire l'attività; ma solleva immediatamente quell'eccezione non appena carica la sua prima classe di dipendenza (che si trova nel barattolo dell'assieme).Lavoratori di scintille non riescono a trovare JAR sul cluster EC2

Ho usato sbt-assembly per creare un jar con le classi, confermato usando jar tvf che le classi ci sono, e impostare SparkConf per distribuire le classi . L'interfaccia utente Spark Web mostra, infatti, il vaso di montaggio per essere aggiunto al percorso di classe: http://172.x.x.x47441/jars/myjar-assembly-1.0.jar

Sembra che, nonostante il fatto che myjar montaggio contiene la classe , e viene aggiunto al cluster, non è raggiunto i lavoratori . Come posso risolvere questo? (Ho bisogno di copiare manualmente il file jar In caso affermativo, a cui dir ho pensato che il punto del SparkConf aggiungere vasetti è stato a farlo automaticamente??)

I miei tentativi di debug hanno dimostrato:

  1. il vaso assemblaggio viene copiato/root/scintilla/lavoro/app-xxxxxx/1/ (determinato mediante ssh a lavoratore e ricerca per vaso)
  2. Tuttavia, tale percorso non appare sulla classpath del lavoratore (Determinato dai registri, che mostrano java -cp ma manca quel file)

Così, sembra come se avessi bisogno di dire Spark di aggiungere il percorso per il vaso di assemblaggio al classpath del lavoratore. Come lo faccio? O c'è un altro colpevole? (Ho passato ore a provare a eseguire il debug di questo, ma senza alcun risultato!)

+0

Una soluzione, che funziona, è quello di copiare il vaso per ogni lavoratore e aggiungerlo esplicitamente a "SPARK_CLASSPATH" su ciascun lavoratore. – SRobertJames

+0

Poiché questa domanda e il commento sopra, SPARK_CLASSPATH sono ora deprecati. – JimLohse

risposta

-1

È necessario registrare un jar con spark cluster mentre si invia l'app, per rendere possibile è possibile modificare il codice come segue.

jars(0) = "/usr/local/spark/lib/spark-assembly-1.3.0-hadoop2.4.0.jar" 
val conf: SparkConf = new SparkConf() 
.setAppName("Busigence App") 
.setMaster(sparkMasterUrl) 
.setSparkHome(sparkHome) 
.setJars(jars); 
0

NOTA: risposta specifica EC2, non una risposta Spark generale. Sto solo cercando di completare una risposta a una domanda posta un anno fa, una che ha lo stesso sintomo ma spesso cause diverse e fa inciampare molte persone.

Se sto capendo correttamente la domanda, mi stai chiedendo, "Devo copiare manualmente il file jar? Se sì, a quale dir?" Dici "e imposta SparkConf per distribuire le classi" ma non sei chiaro se questo viene fatto tramite spark-env.sh o spark-defaults.conf? Quindi, facendo alcune ipotesi, la principale è la tua esecuzione in modalità cluster, ovvero il tuo autista gira su uno dei lavoratori e non sai quale in anticipo ... quindi ...

La risposta è sì , alla dir chiamata nel classpath. In EC2 l'unica memoria persistente è/root/persistent-hdfs, ma non so se sia una buona idea.

In the Spark docs on EC2 I see this line:

To deploy code or data within your cluster, you can log in and use 
the provided script ~/spark-ec2/copy-dir, which, given a directory 
path, RSYNCs it to the same location on all the slaves. 

SPARK_CLASSPATH

io non lo uso SPARK_CLASSPATH perché è sconsigliato come di Spark 1.0 quindi una buona idea è quella di utilizzare la sua sostituzione a $ SPARK_HOME/conf/scintilla-defaults. conf:

spark.executor.extraClassPath /path/to/jar/on/worker 

Questa dovrebbe essere l'opzione che funziona. Se è necessario eseguire questa operazione al volo, non in un file conf, la raccomandazione è "./spark-submit con --driver-class-path per aumentare il classpath del driver" (from Spark docs about spark.executor.extraClassPath e vedere la fine della risposta per un'altra fonte su quella).

MA ... non si sta utilizzando spark-submit ... Non so come funzioni in EC2, guardando lo script non ho capito dove EC2 forniamo questi parametri su una riga di comando . Hai detto che lo fai già nell'impostare il tuo oggetto SparkConf, quindi seguilo se questo funziona per te.

Vedo in Scintilla questa è una domanda molto vecchia quindi mi chiedo come lo hai risolto? Spero che questo aiuti qualcuno, ho imparato molto a ricercare le specifiche di EC2.


devo ammettere, come una limitazione su questo, mi confonde nel Spark docs that for spark.executor.extraClassPath si dice:

Gli utenti in genere non dovrebbe essere necessario impostare questa opzione

Presumo che significa che la maggior parte delle persone otterrà il classpath attraverso un'opzione di configurazione del driver. So che la maggior parte dei documenti per spark-submit fanno in modo che lo script gestisca lo spostamento del codice attorno al cluster, ma penso che sia solo in "modalità client standalone" che presumo non si stia utilizzando, presumo che EC2 debba essere in "standalone" modalità cluster. "


PIÙ/sfondo su SPARK_CLASSPATH deprecazione:

più di fondo che mi porta a pensare SPARK_CLASSPATH is deprecated is this archived thread. e this one, crossing the other thread e this one about a WARN message when using SPARK_CLASSPATH:

14/07/09 13:37:36 WARN spark.SparkConf: 
SPARK_CLASSPATH was detected (set to 'path-to-proprietary-hadoop-lib/*: 
/path-to-proprietary-hadoop-lib/lib/*'). 
This is deprecated in Spark 1.0+. 

Please instead use: 
- ./spark-submit with --driver-class-path to augment the driver classpath 
- spark.executor.extraClassPath to augment the executor classpath 
+0

scusa per alcune cose non di codice formattate come codice, non potevo inviare la domanda con quelle parti come blockquote – JimLohse

+0

Detto questo, ci sono ancora parti dei documenti di Spark che danno indicazioni su come spingere i vasi attraverso un cluster ma anche se si potesse ottenere l'autista per farlo per te, il traffico di rete è uno svantaggio ed è solo per spark-submit, non EC2 http://spark.apache.org/docs/latest/submitting-applications.html# avanzato di dipendenza-gestione – JimLohse

Problemi correlati