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?
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". –
È possibile connettersi a un cluster Spark da una macchina remota. Spark shell è solo un altro programma Scala in esecuzione sul cluster. –
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! –