Apache flink ApacheFlink-过滤器性能提示

Apache flink ApacheFlink-过滤器性能提示,apache-flink,flink-streaming,Apache Flink,Flink Streaming,假设你正在从事一个大的flink项目。同时,您也是客户的keyBy客户ip地址 并意识到您将在不同的代码位置过滤相同的内容,如下所示: public void calculationOne(){ kafkaSource.filter(isContainsSmthA).keyBy(clientip).process(processA).sink(…); } public void calculationTwo(){ kafkaSource.filter(isContainsSmthA).keyB

假设你正在从事一个大的flink项目。同时,您也是客户的
keyBy
客户ip地址

并意识到您将在不同的代码位置过滤相同的内容,如下所示:

public void calculationOne(){
kafkaSource.filter(isContainsSmthA).keyBy(clientip).process(processA).sink(…);
}
public void calculationTwo(){
kafkaSource.filter(isContainsSmthA).keyBy(clientip).process(processB).sink(…);
}
并假设它们是多个
kafkaSource.filter(isContainsSmthA)

现在这种结构导致了flink中的性能问题

如果我像下面这样做,会更好吗

publicsstreamfiltereda(){
返回kafkaSource.filter(isContainsSmthA);
public void calculationOne(){
filteredA().keyBy(clientip.process(processA.sink)(…);
}
public void calculationTwo(){
filteredA().keyBy(clientip.process(processB.sink)(…);
}

这在一定程度上取决于它在操作上的表现

第一种方法对Kafka群集更友好:所有记录都读取一次。过滤器本身是一种非常廉价的操作,因此您无需担心它。然而,这种方法的一大缺点是,如果一个计算速度比其他计算速度慢得多,则会降低它们的速度。如果您不处理历史事件,它应该不管怎样,调整应用程序集群的大小以跟上所有事件都无关紧要。当前的另一个缺点是,如果您在
Calculation2
中失败,那么
calculationOne
中的任务也会重新启动。不过,社区正在积极努力缓解这一问题


第二种方法将只允许重新启动受影响的源->…->接收器子策略。因此,如果您希望频繁重新启动或需要保证某些SLA,则此方法更好。扩展是为每个管道实际提供单独的Flink应用程序。您可以共享同一个jar,但使用不同的参数进行选择提交时使用正确的管道。这种方法还使应用程序的更新更加容易,因为您只会遇到实际修改的管道的停机时间。

我可能会执行以下操作,其中一个简单的包装器操作符可以通过两个不同的函数运行数据,并生成两个输出

SingleOutputStreamOperator comboResults=kafkaSource
.过滤器(IsContainesSMTHA)
.keyBy(clientip)
.process(新的mywrapper函数(processA,processB));
组合结果
.getSideOutput(ProcessAtg)
.水槽(……);
组合结果
.getSideOutput(processBTag)
.水槽(……);

虽然我不知道这与阿维德的建议相比如何。

你说的话对我来说真的很有趣,也很新鲜。案例1:记录是如何处理的?例如,从卡夫卡筛选出的记录A将通过过程A、过程B……过程C,类似于责任链模式。案例2:记录是如何重复的ated?因为我们有一个连续的流程。如果能看到案例1的实现(在flink github repo中),那将是非常棒的。