Это довольно простой вопрос о подключенном потоке с ключами.
Если у меня есть два потока со связанными событиями, которые совместно используют один и тот же логический ключ, и эти потоки соединяются (логически объединяются с использованием ключа), и этовсе работает с параллелизмом> 1, тогда как Flink гарантирует, что два события из разных потоков с одним и тем же логическим ключом попадут в один и тот же экземпляр параллельного оператора?
Вот вымышленный пример о потоках пациентов больницы - температурапоток и сердцебиение поток.Мы хотим объединить эти два потока по идентификатору пациента, используя ConnectedStream
и CoFlatMapFunction
.
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);
}
});
Предположим, что это выполняется с параллелизмом = 3, с операторскими задачами A, B, C, и все ониработает на разных физических машинах.
Flink гарантирует, что все события Temperature
для пациента "JohnDoe" будут в конечном итоге в одном экземпляре параллельного оператора.Скажем, это заканчивается в операторе B.
Но когда Флинк получает HeartBeat
событий для «JohnDoe», как он узнает, что отправляет их оператору B, в который отправляются события Temperature
пациента.Если оба события Temperature
и HeartBeat
не отправляются одному и тому же оператору параллельного экземпляра, объединение не будет работать.
Тот факт, что оба потока используют один и тот же логический ключ (т. Е. Идентификатор пациента), является приложением.а Флинк о конкретном не знает.Эти два подключенных потока могут использовать свои собственные ключи, которые не связаны друг с другом.