SparkStreaming之socketTextStream遇到的一些小问题

实验环境

主机名 IP 操作系统
host1 192.168.110.1 Windows
host2 192.168.110.13 Linux

实验准备

首先在host2上使用nc命令打开端口7777,之后在host1上运行代码

实验代码

import org.apache.spark._
import org.apache.spark.streaming._

object Test {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[*]").setAppName("no_name")
    val ssc = new StreamingContext(conf, Seconds(5))
    val lines = ssc.socketTextStream("192.168.110.13", 7777)
    // 将流的内容原封不动打印
    if (lines != null) {
      lines.print()
      println("start!")
    }
    ssc.start()
    ssc.awaitTermination()
  }
}

问题一:

在host2上开启一个新的终端,使用nc命令连接至本地的7777端口,发现拒绝连接(使用-v参数)。各命令如下:

host2开启并监听7777端口的命令:

nc -l -p 7777

在代码启动后,在host2上尝试新建一个到localhost:7777的socket失败,如下图:

原因:

nc命令默认是一个端口对应于一个socket,即一个端口只能建立一条TCP连接。

解决方法:

将在host2上开启并监听7777端口的命令改为如下:

nc -lk -p 7777

 -k参数意为可以支持多条连接

问题二:

在解决了问题一的基础之上,先在host2上开启7777端口(以-k参数开启),再在host2上另一个终端使用nc命令创建一个到 localhost:7777的socket,最后在host1运行代码。在host2中的两个终端相互发送数据,发现host1的代码无任何输出,如下图:

host2两个终端交互数据:

SparkStreaming之socketTextStream遇到的一些小问题_第1张图片

host1上运行代码:(无任何流内容输出)

SparkStreaming之socketTextStream遇到的一些小问题_第2张图片

原因:

代码中的socketFileStream,之前我以为的是监听host2上的7777端口。如果这个ip上的这个端口收到了任何信息,则这些信息将会被输入到socketFileStream。现在看来,其实不是这样的。它只是单纯地创建了一个与host2:7777的socket,如果host2向这个socket发送消息,这个消息才会进入socketFileStream

解决方法:

先在host2上开启7777端口,再运行代码,再在host2上开启7777端口的终端中输入任意信息,则host1会输出相应信息

正解:

SparkStreaming之socketTextStream遇到的一些小问题_第3张图片

另外:

我发现在开启7777端口的终端中输入的数据,会把数据发送到第一个与其建立连接的socket中,当这个socket断开后,之后的数据会发送给接下来的一个socket(第二个连接的socket),相当于有一个队列存储着各个socket。

你可能感兴趣的:(Spark)