博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SparkStreaming之socketTextStream遇到的一些小问题
阅读量:4111 次
发布时间:2019-05-25

本文共 1371 字,大约阅读时间需要 4 分钟。

实验环境

主机名 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两个终端交互数据:

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

原因:

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

解决方法:

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

正解:

另外:

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

转载地址:http://haesi.baihongyu.com/

你可能感兴趣的文章
沙雕程序员在无聊的时候,都搞出了哪些好玩的小玩意...
查看>>
Mysql复制表以及复制数据库
查看>>
Kafka
查看>>
9.1 为我们的角色划分权限
查看>>
维吉尼亚之加解密及破解
查看>>
TCP/IP协议三次握手与四次握手流程解析
查看>>
PHP 扩展开发 : 编写一个hello world !
查看>>
inet_ntoa、 inet_aton、inet_addr
查看>>
用模板写单链表
查看>>
链表各类操作详解
查看>>
C++实现 简单 单链表
查看>>
Linux的SOCKET编程 简单演示
查看>>
Linux并发服务器编程之多线程并发服务器
查看>>
C语言内存检测
查看>>
Linux epoll模型
查看>>
Linux系统编程——线程池
查看>>
Linux C++线程池实例
查看>>
shared_ptr的一些尴尬
查看>>
C++总结8——shared_ptr和weak_ptr智能指针
查看>>
c++写时拷贝1
查看>>