2014-10-31 26 views
18

Ho un setup Spark cluster con un master e 3 worker. Ho anche Spark installato su una VM CentOS. Sto cercando di eseguire una shell Spark dalla mia VM locale che si connetterà al master e mi consentirà di eseguire un semplice codice Scala. Quindi, ecco il comando ho eseguito il mio VM locale:Come posso eseguire una shell Apache Spark da remoto?

bin/spark-shell --master spark://spark01:7077 

Il guscio corre al punto in cui posso inserire il codice Scala. Dice che gli esecutori sono stati concessi (x3 - uno per ogni lavoratore). Se sbircio l'interfaccia utente del master, posso vedere un'applicazione in esecuzione, Spark shell. Tutti i lavoratori sono VIVI, hanno 2/2 core utilizzati e hanno assegnato 512 MB (su 5 GB) all'applicazione. Quindi, provo ad eseguire il seguente codice Scala:

sc.parallelize(1 to 100).count  

Sfortunatamente, il comando non funziona. Il guscio sarà solo stampare lo stesso avviso all'infinito:

INFO SparkContext: Starting job: count at <console>:13 
INFO DAGScheduler: Got job 0 (count at <console>:13) with 2 output partitions (allowLocal=false) 
INFO DAGScheduler: Final stage: Stage 0(count at <console>:13) with 2 output partitions (allowLocal=false) 
INFO DAGScheduler: Parents of final stage: List() 
INFO DAGScheduler: Missing parents: List() 
INFO DAGScheduler: Submitting Stage 0 (Parallel CollectionRDD[0] at parallelize at <console>:13), which has no missing parents 
INFO DAGScheduler: Submitting 2 missing tasts from Stage 0 (ParallelCollectionRDD[0] at parallelize at <console>:13) 
INFO TaskSchedulerImpl: Adding task set 0.0 with 2 tasks 
WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory 
WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory 
WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory 

A seguito della mia ricerca sul tema, mi hanno confermato che l'URL maestro che sto usando è identico a quello sul interfaccia utente web. Posso eseguire il ping e ssh in entrambe le direzioni (dal cluster alla VM locale e viceversa). Inoltre, ho giocato con il parametro executor-memory (sia aumentando che diminuendo la memoria) senza alcun risultato. Infine, ho provato a disabilitare il firewall (iptables) su entrambi i lati, ma continuo a ricevere lo stesso errore. Sto usando Spark 1.0.2.

TL; DR È possibile eseguire una shell Apache Spark in remoto (e inoltrare intrinsecamente applicazioni in remoto)? Se sì, cosa mi manca?

EDIT: ho dato un'occhiata ai log dei lavoratori e ha scoperto che i lavoratori hanno difficoltà a trovare Spark:

ERROR org.apache.spark.deploy.worker.ExecutorRunner: Error running executor 
java.io.IOException: Cannot run program "/usr/bin/spark-1.0.2/bin/compute-classpath.sh" (in directory "."): error=2, No such file or directory 
... 

Spark è installato in una directory diversa sul mio VM locale che sul cluster. Il percorso che il lavoratore sta tentando di trovare è quello sulla mia VM locale. C'è un modo per me di specificare questo percorso? O devono essere identici ovunque?

Per il momento, ho regolato le mie directory per aggirare questo errore. Ora, il mio Spark Shell fallisce prima che io abbia la possibilità di inserire il comando count (Master removed our application: FAILED). Tutti gli operatori hanno lo stesso errore:

ERROR akka.remote.EndpointWriter: AssociationError [akka.tcp://[email protected]:7078] -> [akka.tcp://[email protected]:53633]: 
Error [Association failed with [akka.tcp://[email protected]:53633]] 
[akka.remote.EndpointAssociationException: Association failed with [akka.tcp://[email protected]:53633] 
Caused by: akka.remote.transport.netty.NettyTransport$$anonfun$associate$1$$annon2: Connection refused: spark02/192.168.64.2:53633 

Come sospetto, sto riscontrando problemi di rete. Cosa dovrei guardare ora?

+0

Potete per favore provare le seguenti due cose. 1. Prova a connetterti al master dal nodo su cui è in esecuzione il master. 2. Prova a sostituire i nomi host con IP "ovunque". –

+0

È possibile connettersi a un cluster Spark da una macchina remota. Spark shell è solo un altro programma Scala in esecuzione sul cluster. –

+0

Sì, questo è possibile e dovrebbe funzionare. Sospetto problemi di rete. Non ne sono sicuro, ma penso che i lavoratori cercheranno di connettersi alla tua macchina locale su qualche porta. Dai sintomi direi che non funziona. Forse puoi trovare più informazioni nei registri dei lavoratori! –

risposta

2

posso risolvere questo problema a mio cliente scintilla e grappolo scintilla.

Controllare la rete, il client A può ping raggrupparsi tra loro! Quindi aggiungere config due linee nel vostro spark-env.sh il cliente A.

primo

export SPARK_MASTER_IP=172.100.102.156 
export SPARK_JAR=/usr/spark-1.1.0-bin-hadoop2.4/lib/spark-assembly-1.1.0-hadoop2.4.0.jar 

Seconda

prova la propria shell scintilla con modalità cluster!

+0

La seconda raccomandazione non ha senso: eseguire' spark-shell' con ' --deploy-mode cluster' risulta in 'Errore: la modalità di distribuzione del cluster non è applicabile a Spark shells 'e la domanda si rivolge specificamente all'esecuzione di una shell remota. – bluenote10

0

Suggerirei di scrivere un semplice programma Scala o Java creando un progetto nel proprio IDE.

Supponiamo di aver creato un progetto chiamato "simpleapp" che ha una struttura di directory come questa.

simpleapp 
- src/main/java 
    - org.apache.spark.examples 
    -SimpleApp.java 
- lib 
    - dependent.jars (you can put all dependent jars inside lib directory) 
- target 
    - simpleapp.jar (after compiling your source) 

Creare oggetti SparkConf e SparkContext nel "SimpleApp.java".

SparkConf conf = new SparkConf().setAppName(appName).setMaster("local[2]"); 
JavaSparkContext sc = new JavaSparkContext(conf); 

Creare un file JAR utilizzando il seguente comando. Puoi trovare il file SimpleApp.class nella cartella "target/classes". cd in questa directory.

jar cfve file.jar SimpleApp.class 

Inserire questo file JAR nel progetto nella directory di destinazione. Questo file JAR contiene la dipendenza della classe SimpleApp durante l'invio del lavoro a Spark. Ora vai nella tua directory di scintille. Sto usando spark-1.4.0-bin-hadoop2.6. Il tuo cmd ha questo aspetto.

spark-1.4.0-bin-hadoop2.6> 

Avviare il master e il lavoratore utilizzando i seguenti comandi.

spark-1.4.0-bin-hadoop2.6> ./sbin/start-all.sh 

Se questo non funziona, avviare master e slave separatamente.

spark-1.4.0-bin-hadoop2.6> ./sbin/start-master.sh 
spark-1.4.0-bin-hadoop2.6> ./sbin/start-slaves.sh 

Invia il tuo programma di scintilla utilizzando Spark Invia. Se hai una struttura come quella che ho spiegato, passa questo argomento in classe.

--class org.apache.spark.examples.SimpleApp 

altro

--class SimpleApp 

Infine presentare il programma di scintilla.

spark-1.4.0-bin-hadoop2.6>./bin/spark-submit --class SimpleApp --master local[2] /home/hadoopnod/Spark_Java/target/file.jar 
+3

Non voglio fare downvote, ma questo non indirizza "l'esecuzione di una shell da remoto". – bluenote10

1

Questo problema può essere causato dalla configurazione di rete. Sembra che l'errore TaskSchedulerImpl: Initial job has not accepted any resources può avere un bel paio di cause (vedi anche this answer):

  • carenza di risorse effettive
  • rotto la comunicazione tra master e lavoratori
  • rotto la comunicazione tra master/lavoratori e autista

Il modo più semplice per escludere le prime possibilità è eseguire un test con una shell Spark in esecuzione direttamente sul master. Se funziona, la comunicazione del cluster all'interno del cluster stesso va bene e il problema è causato dalla comunicazione con l'host del driver. Per analizzare ulteriormente il problema aiuta a esaminare i registri dei lavoratori, che contengono le voci come

16/08/14 09:21:52 INFO ExecutorRunner: Launch command: 
    "/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java" 
    ... 
    "--driver-url" "spark://[email protected]:37752" 
    ... 

e verificare se il lavoratore in grado di stabilire una connessione con IP/porta del conducente. Oltre ai problemi generali di firewall/port forwarding, potrebbe essere possibile che il driver si leghi all'interfaccia di rete sbagliata. In questo caso è possibile esportare SPARK_LOCAL_IP sul driver prima di avviare Spark shell per collegarsi a un'altra interfaccia.

Alcuni riferimenti supplementari: