对于你们中的一些人来说,这似乎是一个非常复杂的问题。我想使用Apache Flink对来自SocketStream的数据应用一些算法。但是,这些算法是我使用Scala的sys.process
包运行的外部可执行文件。这就是我希望Flink做的事情:
从SocketStream获取单独的行:
val text = env.socketTextStream(hostName, port)
val lines = text.flatMap { _.toLowerCase.split("\\n") filter { _.nonEmpty } }
使用这些行作为命令行参数调用我的可执行算法。有点像这样:
var op = "./Somefile.py "+lines!
打印我从可执行文件中获得的输出。
op.print()
显然,这不是我正在尝试做的正确方法op
不像lines
不是数据接收器,因此没有任何东西被打印出来。有什么方法可以实现这个目标吗?
答案 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
}
}