'Connection Refused' 在本地计算机上 运行 Spark Streaming 时出错

'Connection Refused' error while running Spark Streaming on local machine

我知道 'spark streaming connection refused' 问题上已经有很多话题。但其中大部分都在 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

我试过使用不同的端口号,但没有用。所以它一直在循环中重试并不断出现相同的错误。有人有想法吗?

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 是一个客户端套接字,这意味着它期望在您指定的地址和端口上已经有一个服务器 运行ning。除非你有一些服务 运行 在本地计算机的端口 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()
  }
}

这 return 没有任何内容,因为应用程序不使用 HTTP 连接到 bbc 网站,但它没有得到连接被拒绝的异常。

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

cat data.txt | ncat -l -p 7777

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

确保在 运行 程序之前启动 netcat 或端口连接。 nc -lk 8080