我想运行一个Flink Streaming应用程序,它可以类似于一次读取多次写入。基本上,我想从一个消防水管读取数据,对从源读取的到达记录并行应用不同的过滤器,并根据配置将它们发送到不同的接收器。这怎么可能在Flink中做到呢?我认为在KafkaStreams中有一个概念,你可以做到这一点。下面是我希望我的Flink DAG看起来像什么的一个插图:
zzzyeukh1#
实现这一点的最简单方法是使用filter()转换,如下所示:
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,这样您就只需要一个“filter”函数,该函数可以将每个过滤后的流分离为单独的输出,然后您可以对这些输出进行操作。如果您确实需要 n 个不同的流,则可能必须查看要写入的接收器的类型,并考虑在该级别处理筛选
liwlm1x92#
如果你有很多数据流,那么你肯定希望使用一个带有副输出的ProcessFunction,就像Rion上面提到的那样,否则你会把数据流复制N次,效率非常低。
2条答案
按热度按时间zzzyeukh1#
实现这一点的最简单方法是使用
filter()
转换,如下所示:或者,您可以考虑使用Side Outputs,这样您就只需要一个“filter”函数,该函数可以将每个过滤后的流分离为单独的输出,然后您可以对这些输出进行操作。
如果您确实需要 n 个不同的流,则可能必须查看要写入的接收器的类型,并考虑在该级别处理筛选
liwlm1x92#
如果你有很多数据流,那么你肯定希望使用一个带有副输出的ProcessFunction,就像Rion上面提到的那样,否则你会把数据流复制N次,效率非常低。