从Flink

时间:2016-03-16 06:52:37

标签: apache-flink

对于你们中的一些人来说,这似乎是一个非常复杂的问题。我想使用Apache Flink对来自SocketStream的数据应用一些算法。但是,这些算法是我使用Scala的sys.process包运行的外部可执行文件。这就是我希望Flink做的事情:

  1. 从SocketStream获取单独的行:

    val text = env.socketTextStream(hostName, port) val lines = text.flatMap { _.toLowerCase.split("\\n") filter { _.nonEmpty } }

  2. 使用这些行作为命令行参数调用我的可执行算法。有点像这样:

    var op = "./Somefile.py "+lines!

  3. 打印我从可执行文件中获得的输出。

    op.print()

  4. 显然,这不是我正在尝试做的正确方法op不像lines不是数据接收器,因此没有任何东西被打印出来。有什么方法可以实现这个目标吗?

1 个答案:

答案 0 :(得分:2)

如果将所有参数放入单个String值,则可以从MapFunction调用外部可执行文件。

这看起来像是:

val args: DataStream[String] = env.socketTextStream(hostName, port) 
// assume each text line has all elements
val out: DataStream[String] = args.map(new ExternalCaller())
// print result
out.print()

class ExternalCaller extends MapFunction[String, String] {

  override def map(args: String): String = {
    // call external executable with args here and return output
  }
}