Apache flink Flink:在CoFlatMapFunction中共享状态

Apache flink Flink:在CoFlatMapFunction中共享状态,apache-flink,flink-streaming,Apache Flink,Flink Streaming,使用CoFlatMapFunction时有点卡住了。如果我把它放在DataStreambefore窗口上,它似乎可以正常工作,但如果放在窗口的“apply”函数之后,它就会失败 我在测试两个流,在flatMap1上的主要“功能”不断摄取数据,在flatMap2上的控制流“模型”根据请求更改模型 我能够在flatMap2中正确设置并查看b0/b1,但是flatMap1始终可以看到b0和b1在初始化时设置为0 我是不是漏掉了什么明显的东西 public静态类applyModel实现coflatmap

使用
CoFlatMapFunction
时有点卡住了。如果我把它放在
DataStream
before窗口上,它似乎可以正常工作,但如果放在窗口的“apply”函数之后,它就会失败

我在测试两个流,在
flatMap1
上的主要“功能”不断摄取数据,在
flatMap2
上的控制流“模型”根据请求更改模型

我能够在
flatMap2
中正确设置并查看b0/b1,但是
flatMap1
始终可以看到b0和b1在初始化时设置为0

我是不是漏掉了什么明显的东西

public静态类applyModel实现coflatmap函数{
私有静态最终长serialVersionUID=1L;
双b0;
双b1;
公共应用程序模型(){
b0=0.0;
b1=0.0;
}
@凌驾
公共void flatMap1(特征值,收集器输出){
系统输出打印(“主:“+this+”\n”);
}
@凌驾
公共void flatMap2(模型值,收集器输出){
System.out.print(“旧型号:“+this+”\n”);
b0=value.getB0();
b1=value.getB1();
System.out.print(“新型号:“+this+”\n”);
}
@凌驾
公共字符串toString(){
返回“CoFlatMapFunction:{b0:+b0+”,b1:+b1+”};
}
}

以下是邮件列表中的答案

CoFlatMapFunction是否打算并行执行

如果是,您需要某种方法来确定分配哪个记录 转到哪个并行实例。在某种程度上,coflatmap函数 模型和结果之间是否有并行(分区)连接 会话窗口,因此您需要某种形式的键来选择 将元素分区到。这有意义吗

如果不是,请尝试显式地将其设置为parallelism 1

你好,斯蒂芬


所有人都可以只读访问的全局状态可以通过 广播()

可供所有人读取和更新的全局状态为 目前不可用。在这方面保持一致的操作将是非常重要的 成本高昂,需要某种形式的分布式通信/共识

相反,我鼓励您采用以下方法:

1) 如果可以对状态进行分区,请使用keyBy().mapWithState()-即 本地化状态操作并使其非常快速

2) 如果您的状态不是按键组织的,那么您的状态可能非常复杂 很小,您可以使用非并行操作

3) 如果某个操作更新状态,而另一个操作访问该状态, 您通常可以通过迭代和CoFlatMapFunction来实现这一点 (一边是原始输入,另一边是反馈输入)

所有方法最终都将状态访问和修改本地化, 如果可能的话,这是一个很好的模式

你好,斯蒂芬


您在窗口中的应用功能中执行什么操作?也许您可以与我们共享相应的代码。for(原始值:values){if(value.getTs()>end_ts)end_ts=value.getTs();if(value.getTs()