'拒绝连接'在本地计算机上运行Spark Streaming时出错

时间:2015-07-26 01:40:17

标签: scala apache-spark spark-streaming

我知道已经有许多线程已经关闭了火花流连接拒绝了#39;的问题。但其中大部分是在Linux或至少指向HDFS。我在Windows的本地笔记本电脑上运行它。

我正在运行一个非常简单的基本Spark流式独立应用程序,只是为了了解流式传输的工作原理。这里没有做任何复杂的事情: -

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

我收到以下错误: -

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

我尝试使用不同的端口号,但它没有帮助。所以它继续在循环中重试并继续得到相同的错误。有没有人有想法?

1 个答案:

答案 0 :(得分:14)

socketTextStream的代码中,Spark创建了SocketInputDStream的实例,该实例使用java.net.Socket https://github.com/apache/spark/blob/master/streaming/src/main/scala/org/apache/spark/streaming/dstream/SocketInputDStream.scala#L73

java.net.Socket是一个客户端套接字,这意味着它希望服务器已经在您指定的地址和端口上运行。除非您在本地计算机的端口7777上运行服务器,否则您看到的错误与预期一致。

要了解我的意思,请尝试以下操作(您可能不需要在您的环境中设置masterappName)。

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

这不会返回任何内容,因为该应用不会向bbc网站说HTTP,但它不会获得连接拒绝例外。

要在linux上运行本地服务器,我会使用netcat和一个简单的命令,例如

cat data.txt | ncat -l -p 7777

我不确定您在Windows中的最佳方法是什么。您可以编写另一个应用程序,该应用程序在该端口上侦听服务器并发送一些数据。