spark streaming官方教程有个NetworkWordCount例子,通过 TCP 套接字连接,从流数据中创建了一个 DStream,然后进行处理,时间窗口大小为10s 。
其中需要使用netcat作为数据数据服务器,window下执行:
nc -lk 9999
结果报“’nc’ 不是内部或外部命令,也不是可运行的程序或批处理文件。”
哦,没有安装netcat,于是
- 下载netcat(https://eternallybored.org/misc/netcat/netcat-win32-1.12.zip)
- 解压,将nc.exe拷贝到C:\Windows下。
再次执行:nc -lk 9999,结果报“ nc: invalid option – k”
然后 nc -h 了一下,确实没有-k参数。我又在unix系统上nc -h了一下,确认是有-k参数的。
好吧,改成:
nc -l 9999
结果报“local listen fuxored: INVAL”
看样子windows和unix环境下nc的用法也不一样,查了下,改成 :
nc -l -p 9999
好吧,开始监听了。
这时,你尝试输入一些内容,你的输入并不会显示出来,你都不知道你有没有输入了。
将读取sock的程序启动后,之前输入的未显示的数据就显示出来了。(是不是有点坑爹)
后面再输入内容,也都实时显示了。
spark-streaming 的wordcount:
// env
SparkConf conf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount");
JavaStreamingContext jssc = new JavaStreamingContext(conf, Durations.seconds(10));
// input
// Create a DStream that will connect to hostname:port, like localhost:9999
JavaReceiverInputDStream<String> lines = jssc.socketTextStream("localhost", 9999);
// Split each line into words
JavaDStream<String> words = lines.flatMap(x -> Arrays.asList(x.split(" ")).iterator());
// Count each word in each batch
JavaPairDStream<String, Integer> pairs = words.mapToPair(s -> new Tuple2<>(s, 1));
JavaPairDStream<String, Integer> wordCounts = pairs.reduceByKey((i1, i2) -> i1 + i2);
// output
wordCounts.print();
// execute
jssc.start();
jssc.awaitTermination();
我在窗口输入了:
my test is a test
spark-streaming 的wordcount输出了:
-------------------------------------------
Time: 1526885630000 ms
-------------------------------------------
(is,1)
(my,1)
(test,2)
(a,1)