我想运行一个 Flink Streaming 应用程序,它适用于一次读取多次写入类比。基本上,我想从 firehose 读取,并行应用不同的过滤器以从源读取到达记录,并根据配置将它们发送到不同的接收器。
这在 Flink 中如何实现?我认为在 KafkaStreams 中有一个概念可以做到这一点。下面是我希望我的 Flink DAG 看起来像的例子:
filter()
转换,如下所示:
DataStream<X> stream = ...;
// Filter 1
stream
.filter { x -> x.property == 1 }
.sinkTo(sink1)
// Filter 2
stream
.filter { x -> x.property == 2 }
.sinkTo(sink2)
// Repeat ad nauseum
或者,您可以考虑使用 Side Outputs 这样您只需要一个“过滤器”功能,它可以处理将每个过滤后的流分离成单独的输出,然后您可以对其进行操作。
如果您绝对需要 n 不同的流,您可能必须查看您打算写入的接收器类型并考虑在该级别处理过滤
如果你有很多流,那么你肯定想使用带有边输出的 ProcessFunction,正如 Rion 上面提到的。否则你将复制数据流 N 次,这是非常低效的。
在 GitHub 的 flink-training repo 中可以找到一个以这种方式拆分流的示例 - 请参阅 RideSplitSideOutputSolution 类。