Apache Flink: как разделены события для ключевой функции CoFlatMapFunction? - PullRequest
0 голосов
/ 02 июня 2018

Это довольно простой вопрос о подключенном потоке с ключами.

Если у меня есть два потока со связанными событиями, которые совместно используют один и тот же логический ключ, и эти потоки соединяются (логически объединяются с использованием ключа), и этовсе работает с параллелизмом> 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 не отправляются одному и тому же оператору параллельного экземпляра, объединение не будет работать.

Тот факт, что оба потока используют один и тот же логический ключ (т. Е. Идентификатор пациента), является приложением.а Флинк о конкретном не знает.Эти два подключенных потока могут использовать свои собственные ключи, которые не связаны друг с другом.

1 Ответ

0 голосов
/ 02 июня 2018

Конечно, выбор ключей зависит от приложения.Однако Flink знает, как получить доступ к клавишам, поскольку вы предоставляете функции выбора клавиш (pt -> pt.getPatientId() и hbt -> hbt.getPatientId()).Flink гарантирует, что ключи обоих потоков имеют одинаковый тип, и применяет одинаковую хэш-функцию к обоим потокам, чтобы определить, куда отправить запись.

Следовательно, одинаковые значения обоих потоков отправляются одному и тому же экземпляру оператора.

...