2015-07-26 3 views
6

So che ci sono già molti thread su problemi di "spark streaming connection refused". Ma la maggior parte di questi sono in Linux o almeno puntano a HDFS. Sto facendo funzionare questo sul mio laptop locale con Windows.Errore "Connessione rifiutata" durante l'esecuzione di Spark Streaming sulla macchina locale

Sto eseguendo un'applicazione standalone di base Spark di base molto semplice, solo per vedere come funziona lo streaming. Non fare nulla complesso qui: -

import org.apache.spark.streaming.Seconds 
import org.apache.spark.streaming.StreamingContext 
import org.apache.spark.SparkConf 

object MyStream 
{ 
    def main(args:Array[String]) 
    { 
     val sc = new StreamingContext(new SparkConf(),Seconds(10)) 
     val mystreamRDD = sc.socketTextStream("localhost",7777) 
     mystreamRDD.print() 
     sc.start() 
     sc.awaitTermination() 
    } 
} 

Sto ottenendo il seguente errore: -

2015-07-25 18:13:07 INFO ReceiverSupervisorImpl:59 - Starting receiver 
2015-07-25 18:13:07 INFO ReceiverSupervisorImpl:59 - Called receiver onStart 
2015-07-25 18:13:07 INFO SocketReceiver:59 - Connecting to localhost:7777 
2015-07-25 18:13:07 INFO ReceiverTracker:59 - Registered receiver for  stream 0 from 192.168.19.1:11300 
2015-07-25 18:13:08 WARN ReceiverSupervisorImpl:92 - Restarting receiver  with delay 2000 ms: Error connecting to localhost:7777 
java.net.ConnectException: Connection refused 

Ho provato con diversi numeri di porta, ma non aiuta. Quindi continua a riprovare in loop e continua a ottenere lo stesso errore. Qualcuno ha un'idea?

risposta

12

All'interno del codice per socketTextStream, Spark crea un'istanza di SocketInputDStream che utilizza java.net.Sockethttps://github.com/apache/spark/blob/master/streaming/src/main/scala/org/apache/spark/streaming/dstream/SocketInputDStream.scala#L73

java.net.Socket è un socket client, il che significa che si aspetta che ci sia un server già in esecuzione presso l'indirizzo e la porta specificata. A meno che non si disponga di un servizio che esegue un server sulla porta 7777 del proprio computer locale, l'errore che si sta verificando è come previsto.

Per vedere cosa intendo, provare quanto segue (potrebbe non essere necessario impostare master o appName nel proprio ambiente).

import org.apache.spark.streaming.Seconds 
import org.apache.spark.streaming.StreamingContext 
import org.apache.spark.SparkConf 

object MyStream 
{ 
    def main(args:Array[String]) 
    { 
    val sc = new StreamingContext(new SparkConf().setMaster("local").setAppName("socketstream"),Seconds(10)) 
    val mystreamRDD = sc.socketTextStream("bbc.co.uk",80) 
    mystreamRDD.print() 
    sc.start() 
    sc.awaitTermination() 
    } 
} 

Questo non restituisce alcun contenuto perché l'applicazione non parla HTTP al sito web della BBC, ma non ottiene una connessione rifiutata un'eccezione.

eseguire un server locale quando su linux, vorrei usare netcat con un semplice comando, come

cat data.txt | ncat -l -p 7777 

Non sono sicuro di ciò che il vostro approccio migliore è in Windows. Potresti scrivere un'altra applicazione che ascolta come un server su quella porta e invia alcuni dati.

+0

Quindi lo streaming di Spark si trova sul lato client e non sul server Web? Ho pensato che Spark Streaming fosse eseguito sul server web e qualunque richiesta il server Web riceva dai suoi client, ritorna come 'stream'. Ma poi se viene eseguito sul nodo client web, esattamente quali dati vengono restituiti a Spark come 'stream'? Il server web è un agente passivo (in quanto attende solo le richieste dei client e restituisce la risposta), quindi vuol dire che lo 'stream' è la 'risposta' restituita dal server web? Ma a meno che il modulo spark streaming non faccia qualche richiesta attiva, in che modo restituirà anche qualsiasi risposta? – Dhiraj

+0

Spark Streaming non è proprio un client o un server, è lì per elaborare uno stream. In genere richiede un ricevitore per iniziare a inserire i dati nel calcolo. Esistono diversi tipi di ricevitore. Nel tuo codice qui sopra, 'socketTextStream' configura un Receiver che funge da client che si aspetta un Server dall'altra parte. Dai un'occhiata a https://spark.apache.org/docs/1.2.0/api/scala/index.html#org.apache.spark.streaming.StreamingContext potresti usare meglio 'textFileStream' se sei solo sperimentando, che avvierà un flusso leggendo i file in una directory. – mattinbits