我正在为测试用例编写一些函数,这些函数被注入对对象的一些共享引用。假设像这样的int
:
SinkFunction
和测试代码:
class Collector[T](collection: ListBuffer[T]) extends SinkFunction[T] {
override def invoke(in: T, context: SinkFunction.Context[_]): Unit = {
collection.append(in)
}
}
我运行了测试,但是测试结束val env = StreamExecutionEnvironment.getExecutionEnvironment
val list = ListBuffer.empty[String]
env.fromElements("Hello").addSink(new Collector(list))
env.execute()
println(list)
还是空的!
我查看了文档(https://ci.apache.org/projects/flink/flink-docs-release-1.4/dev/stream/testing.html),发现原始示例使用的是单例引用。
因此,我要确保Apache Flink在内部如何工作:即使在本地部署中,它也会将所有添加的功能序列化到流中吗?
答案 0 :(得分:0)
是的,Flink序列化了所有功能。例如,如果您查看SinkFunction,就会发现它implements Serializable
。
如果要在作业和客户端(将作业发送到Flink的程序)之间共享数据,则必须使用文件,套接字,消息传递(RMQ,Kafka)或类似的机制自己进行管理。 / p>