Вызывает ли Flink нажатие на том же поле, которое не было изменено, вызывает случайное перемешивание? - PullRequest
1 голос
/ 09 ноября 2019
dataStream.map(func1).keyBy("key") //(1)
  .process(func2).keyBy("key")     //(2)
  .timeWindow().aggregate(func3).addSink(sink)

Метод process () не меняет значение поля (ключа) записей. Учитывая, что параллелизм всех операторов равен 2, приводит ли keyBy () в (2) также к перестановкам в сети? Возможно, keyBy () в (2) дает эффект стратегии переадресации, позволяющей избежать затрат на сетевую связь из-за неизменного значения ключа?

Thx soooo много ~

1 Ответ

2 голосов
/ 09 ноября 2019

keyBy всегда дорог, потому что заставляет записи проходить через ser / de. Но в случае, когда связь является локальной - то есть в пределах одного и того же слота задачи - тогда Flink будет использовать общий буфер для передачи сериализованных байтов, а не проходить через весь стек netty tcp. Так что да, в вашем случае второй ключ дешевле, чем первый. Но я бы не сказал, что стоимость небольшая.

Если вы знаете, что keyBy совершенно не нужен, вы можете использовать reinterpretAsKeyedStream , чтобы снова получить KeyedStream без всего этогонакладные расходы.

...