为什么Spark Streaming应用程序不能从echo piped到nc命令接收消息?

时间:2017-05-31 09:53:17

标签: scala apache-spark spark-streaming netcat

我使用SparkStream:

val stream = ssc.socketTextStream("192.168.206.184", 8888)

创建Socket服务器使用NC:

[root@master ~]# nc -lk 192.168.206.184 8888 

如果我手动将一些消息输入NC终端,则saprkstream可以接收消息。

但是,如果我使用NC命令发送消息由另一个终端使用以下代码,NC服务器终端可以接收消息,但是火花流无法接收消息

echo "message content"|nc 192.168.206.184 8888

1 个答案:

答案 0 :(得分:1)

TL; DR 使用-lk为案例添加echo个选项。

我对nc的有限经验告诉我,问题在于缺少-lk选项。

引用the man page of nc

  

-k 强制nc在其符号之后继续侦听另一个连接                租金连接完成。使用此选项是错误的                没有-l选项。

     

-l <​​/ strong>用于指定nc应侦听传入连接                而不是启动与远程主机的连接。它是一个                将此选项与-p,-s或-z一起使用时出错                选项。此外,使用-w选项指定的任何超时                被忽略了。

幸运的是,非常相似的Spark Streaming应用程序包含在Spark的示例中,因此很容易重现。

// start sc.socketTextStream in one terminal
$ ./bin/run-example streaming.NetworkWordCount 127.0.0.1 9999

当我使用nc并且没有echo选项执行-lk时,我在NetworkWordCount示例的终端中什么也得不到,否则输入会被解析。

// terminal 2
$ echo "message content"|nc -lk 127.0.0.1 9999

// terminal 1
$ ./bin/run-example streaming.NetworkWordCount 127.0.0.1 9999
...
-------------------------------------------
Time: 1496230563000 ms
-------------------------------------------
(content,1)
(message,1)