将数据流从VM套接字/远程套接字发送到在主机操作系统上运行的Flink程序

时间:2017-08-15 18:59:31

标签: sockets ssh apache-flink flink-streaming flink-cep

正如Flink文档中所提到的,通过使用

打开本地套接字,我能够从文本服务器读取文本输入
amar@admin:~$ nc -l 12345

然后使用

在Flink程序上接收它
DataStream<String> text = env.socketTextStream("localhost", 12345);

text.print();

env.execute();

但是,由于我正在模拟某些场景,所以我想从VM(最后是各种VM)获取数据流并将其发送到在主机操作系统上运行的CEP程序。

所以,我已经使用vagrant ssh

使用Vagrant和SSH安装了VM
  1.   

    来宾操作系统的主机名是精确的64

  2.   

    使用ifconfig = 10.0.2.15的IP地址

  3. 现在,我想要做的是看看我是否可以从VM发送一些数据并在Flink程序中接收它,就像我在本地环境中一样。

    我使用

    在来宾操作系统上打开了Netcat套接字
    vagrant@precise64:~$ nc -l 12345
    

    我试图通过使用主机程序接收它,但出现错误

    DataStream<String> text = env.socketTextStream("precise64", 12345);
    
    text.print();
    
    env.execute();
    

    我也尝试过上面的tiny64@10.0.2.15,但我认为我做错了。

    任何想法,我应该如何处理从VM发送DataStream到主机Flink程序

    建议非常欢迎,提前谢谢!

1 个答案:

答案 0 :(得分:1)

你可以试试这个:

<强> 1.Program:

import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time

object WindowWordCount {
  def main(args: Array[String]) {

    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val text = env.socketTextStream("localhost", 9999)

    val counts = text.flatMap { _.toLowerCase.split("\\W+") filter { _.nonEmpty } }
      .map { (_, 1) }
      .keyBy(0)
      .timeWindow(Time.seconds(5))
      .sum(1)

    counts.print

    env.execute("Window Stream WordCount")
  }
}

2.运行上述程序。你可以开始这个。

nc -lk 9999

这样可行。