Как Flinks Collector.collect () обрабатывает данные?

Я пытаюсь понять, что делает Flinks Collector.collect () и как он обрабатывает входящие / исходящие данные:

Пример взят из Flink DataSet API:

Следующий код преобразует DataSet текстовых строк в DataSet слов:


DataSet<String> output = input.flatMap(new Tokenizer());

public class Tokenizer implements FlatMapFunction<String, String> {
  @Override
  public void flatMap(String value, Collector<String> out) {
    for (String token : value.split("\\W")) {
      out.collect(token);
    }
  }
}

Таким образом, текстовые строки разделяются на токены, и каждая из них собирается. Как бы интуитивно это ни звучало, но мне не хватает реальной динамики Collector.collect (). Где хранятся собранные данные до того, как они будут назначены для вывода, т.е. помещает ли их Flink в какой-то буфер? И если да, то как данные передаются в сеть?


person tooobsias    schedule 04.11.2020    source источник


Ответы (1)


из официального документация по исходному коду.

Собирает запись и пересылает ее. Сборщик - это push-аналог {@link java.util.Iterator}, который извлекает данные.

Итак, он получает значение и сохраняет одно или несколько значений в итераторе. Затем переходит к следующему оператору. Но это вопрос сетевого стека / буферов.

person Felipe    schedule 04.11.2020
comment
Но происходит ли какая-то сериализация / десериализация данных между получением (Iterable) и частью хранения (Collector)? Данный пример может немного ввести в заблуждение. Представьте себе слегка измененную функцию flatMap сверху, которая просто возвращает измененную строку через collector.collect (value). например: public void flatMap(String value, Collector<String> out) { out.collect(value); } } Что происходит с фактически обрабатываемыми данными? Есть ли какой-то трафик от коллектора? - person tooobsias; 04.11.2020
comment
это зависит от следующего оператора. скажем, у вас есть оператор keyBy после flatmap. Оператор keyBy разделяет данные на фазу перемешивания. Вполне вероятно, что оператор после keyBy - это reducer, и он находится на другом компьютере. Затем произойдет де / сериализация. Теперь, если оператор после flatmap является другим map, он может быть помещен на тот же компьютер и в TaskManager. Затем Flink объединяет оба оператора в одном потоке, и де / сериализации не происходит. - person Felipe; 04.11.2020
comment
это хорошая ссылка: flink.apache.org/2019/ 05 июня / flink-network-stack.html - person Felipe; 04.11.2020
comment
Это было то, что я искал! Спасибо - person tooobsias; 05.11.2020