2015-07-26 35 views
6

Tôi biết có nhiều chủ đề đã có trên các vấn đề 'phát trực tuyến tia lửa từ chối'. Nhưng hầu hết trong số này là trong Linux hoặc ít nhất là chỉ đến HDFS. Tôi đang chạy trên máy tính xách tay địa phương của tôi với Windows.Lỗi 'Bị từ chối kết nối' khi chạy Spark Streaming trên máy cục bộ

Tôi đang chạy một ứng dụng độc lập Spark streaming cơ bản rất đơn giản, chỉ để xem cách phát trực tuyến hoạt động. Không làm bất cứ điều gì phức tạp ở đây: -

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() 
    } 
} 

Tôi nhận được lỗi sau: -

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 

Tôi đã cố gắng sử dụng số cổng khác nhau, nhưng nó không giúp đỡ. Vì vậy, nó tiếp tục thử lại trong vòng lặp và tiếp tục nhận được lỗi tương tự. Có ai có ý tưởng gì không?

Trả lời

12

Trong mã cho socketTextStream, Spark tạo ra một thể hiện của SocketInputDStream trong đó sử dụng java.net.Sockethttps://github.com/apache/spark/blob/master/streaming/src/main/scala/org/apache/spark/streaming/dstream/SocketInputDStream.scala#L73

java.net.Socket là một client socket, có nghĩa là nó là hy vọng có được một máy chủ đang chạy tại địa chỉ và cổng bạn chỉ định. Trừ khi bạn có một số dịch vụ đang chạy một máy chủ trên cổng 7777 của máy cục bộ của bạn, lỗi bạn đang thấy là như mong đợi.

Để xem ý tôi là gì, hãy thử những điều sau đây (bạn có thể không cần đặt master hoặc appName trong môi trường của mình).

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() 
    } 
} 

Điều này không trả về bất kỳ nội dung nào vì ứng dụng không nói HTTP với trang web bbc nhưng không có ngoại lệ từ chối kết nối.

Để chạy một máy chủ địa phương khi trên linux, tôi sẽ sử dụng netcat với một lệnh đơn giản như

cat data.txt | ncat -l -p 7777 

Tôi không chắc chắn những gì phương pháp tốt nhất của bạn là trong Windows. Bạn có thể viết một ứng dụng khác mà lắng nghe như một máy chủ trên cổng đó và gửi một số dữ liệu.

+0

Vì vậy, luồng phát trực tiếp nằm ở phía máy khách chứ không phải trên máy chủ Web? Tôi nghĩ rằng Spark Streaming thực thi trên máy chủ web và bất cứ yêu cầu nào mà máy chủ web nhận được từ các máy khách của nó, nó sẽ trả về dưới dạng 'luồng'. Nhưng sau đó nếu nó thực thi trên nút máy khách web, chính xác dữ liệu nào sẽ trả về Spark là 'luồng'? Máy chủ web là một tác nhân thụ động (vì nó chỉ chờ các yêu cầu của máy khách và trả về phản hồi), vậy có nghĩa là 'luồng' là 'phản hồi' mà máy chủ web trả về không? Nhưng trừ khi mô-đun phát trực tuyến phát ra một số yêu cầu hoạt động, nó sẽ trả về bất kỳ phản hồi nào? – Dhiraj

+0

Spark Streaming không thực sự là trường hợp khách hàng hoặc máy chủ, nó có thể xử lý luồng. Nó thường đòi hỏi một người nhận để bắt đầu với việc đưa dữ liệu vào tính toán của bạn. Có nhiều loại máy thu khác nhau. Trong mã của bạn ở trên, 'socketTextStream' thiết lập một Máy thu hoạt động như một máy khách đang mong đợi một Máy chủ ở đầu bên kia. Hãy xem https://spark.apache.org/docs/1.2.0/api/scala/index.html#org.apache.spark.streaming.StreamingContext bạn có thể sử dụng 'textFileStream' tốt hơn nếu bạn chỉ thử nghiệm, sẽ bắt đầu một luồng bằng cách đọc các tệp trong một thư mục. – mattinbits

Các vấn đề liên quan