Apache flink ApacheFlink:如何为键控的CoFlatMapFunction划分事件?

Apache flink ApacheFlink:如何为键控的CoFlatMapFunction划分事件?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,这是一个关于连接键控流的基本问题 如果我有两个具有共享相同逻辑键的相关事件的流,并且这些流正在连接(使用该键进行逻辑连接),并且所有这些流都在并行度>1的情况下运行,那么Flink如何保证来自具有相同逻辑键的不同流的两个事件在同一个并行操作符实例中结束 这里是一个关于医院病人流的虚构例子——体温流和心跳流。我们希望使用ConnectedStream和CoFlatMapFunction通过患者id连接这两个流 DataStream<PatientTemperature> tempera

这是一个关于连接键控流的基本问题

如果我有两个具有共享相同逻辑键的相关事件的流,并且这些流正在连接(使用该键进行逻辑连接),并且所有这些流都在并行度>1的情况下运行,那么Flink如何保证来自具有相同逻辑键的不同流的两个事件在同一个并行操作符实例中结束

这里是一个关于医院病人流的虚构例子——体温流和心跳流。我们希望使用
ConnectedStream
CoFlatMapFunction
通过患者id连接这两个流

DataStream<PatientTemperature> temperatureStream = ..
DataStream<HeartbeatStream> heartbeatStream = ..

temperatureStream
   .keyBy(pt -> pt.getPatientId())
   .connect (heartBeatStream.keyBy(hbt -> hbt.getPatientId() )
   .flatMap (new RichCoFlatMapFunction() {

         ValueState<PatientTemperatureAndHeartBeat> state = ...

         public void flatMap1(PatientTemperature value, Collector<PatientTemperatureAndHeartBeat> out) {
                state.value().setTemperature(value);  
         }

      public void flatMap2(PatentHeartbeat value, Collector<PatientTemperatureAndHeartBeat> out) {

               PatientTemperatureAndHeartBeat temperatureAndHeartBeat = state.value()
               temperatureAndHeartBeat.setHeartBeat(value)
               out.collect(temperatureAndHeartBeat);

      }

      });
DataStream temperatureStream=。。
数据流heartbeatStream=。。
温度蒸汽
.keyBy(pt->pt.getPatientId())
.connect(heartBeatStream.keyBy(hbt->hbt.getPatientId())
.flatMap(新的RichCoFlatMapFunction(){
ValueState状态=。。。
公共空间平面图1(患者温度值,收集器输出){
state.value().setTemperature(值);
}
public void flatMap2(PatentTheArtBeat值,收集器输出){
PatientTemperatureAndHeartBeat temperatureAndHeartBeat=state.value()
temperatureAndHeartBeat.setHeartBeat(值)
取出。收集(温度和轴承座);
}
});
假设这是在并行度=3的情况下运行的,操作员任务A、B、C都在不同的物理机器上运行

Flink将保证患者“JohnDoe”的所有
温度
事件将在同一个并行操作符实例中结束。假设它在操作符B中结束

但是,当Flink接收到“JohnDoe”的
HeartBeat
事件时,它如何知道将它们发送给操作员B,在那里发送患者的
Temperature
事件。除非
Temperature
HeartBeat
事件都发送给同一个并行实例操作员,否则连接将无法工作


两个流使用相同的逻辑密钥(即患者id)是特定于应用程序的,Flink不知道。这两个连接的流可能使用它们自己的键,它们彼此不相关。

当然,键的选择是特定于应用程序的。但是,Flink知道如何访问键,因为您提供了键选择器函数(
pt->pt.getPatientId()
hbt->hbt.getPatientId()
)。Flink确保两个流的键具有相同的类型,并对两个流应用相同的哈希函数以确定将记录发送到何处


因此,两个流的相同值被发送到同一个操作员实例。

感谢您的响应。如果它们具有不同的键,它是否仍然有效?例如,如果一个流键入了患者ID(整数),而另一个流键入了患者的全名(字符串).Flink是否能够将同一患者的记录从两条流发送到同一操作员实例?temperatureStream.keyBy(pt->pt.getPatientId()).connect(heartBeatStream.keyBy(hbt->hbt.getPatientFullName()).flatMap(新的RichCoFlatMapFunction())Flink检查键的类型是否匹配。因此,一侧的整数键和另一侧的字符串键将被拒绝。除此之外,Flink使用您指定的键。@FabianHueske by“两个流的相同值将发送到同一个运算符实例”你也指同一台物理机器,对吗?是的,一台操作员实例在一台机器上运行。但是一台机器可以运行多个操作员实例。