在并行 Flink DataStream 中应用多个过滤器

问题描述 投票:0回答:2

我想运行一个 Flink Streaming 应用程序,它适用于一次读取多次写入类比。基本上,我想从 firehose 读取,并行应用不同的过滤器以从源读取到达记录,并根据配置将它们发送到不同的接收器。

这在 Flink 中如何实现?我认为在 KafkaStreams 中有一个概念可以做到这一点。下面是我希望我的 Flink DAG 看起来像的例子:

apache-flink flink-streaming
2个回答
1
投票

完成此操作的最简单方法是使用

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 不同的流,您可能必须查看您打算写入的接收器类型并考虑在该级别处理过滤


0
投票

如果你有很多流,那么你肯定想使用带有边输出的 ProcessFunction,正如 Rion 上面提到的。否则你将复制数据流 N 次,这是非常低效的。

在 GitHub 的 flink-training repo 中可以找到一个以这种方式拆分流的示例 - 请参阅 RideSplitSideOutputSolution 类。

© www.soinside.com 2019 - 2024. All rights reserved.