Поток Flink, что именно делает sum? - PullRequest
0 голосов
/ 06 марта 2019

У меня проблемы с пониманием потоковой передачи, возьмем, к примеру, количество рабочих мест для бесконечного источника, такого как Кафка, что именно делает «сумма»?

DataStream<Tuple2<String, Long>> counts = input
                ......
                .returns(Types.TUPLE(Types.STRING, Types.LONG))
                .keyBy(0)
                .sum(1);

Я понимаю это, когда есть временное окно,«пакет» для меня, поскольку у него есть время начала и окончания, но когда нет временного окна,

  1. Что такое время начала и время окончания?
  2. Когда 3-йtime Flink получает слово «foo», «sum» проходит через все старые «foo», делает 1 + 1 + 1 и дает результат «3».Или Flink каким-то образом сохраняет промежуточный результат «2» на предыдущем шаге, поэтому «sum» делает только 2 + 1?
  3. Есть ли альтернативный способ сделать сумму, я имею в виду, использовать keyBy (0).process (...) или что-то?

1 Ответ

2 голосов
/ 06 марта 2019

Указанная программа преобразуется в StreamGroupedReduce с SumAggregator. StreamGroupedReduce будет постоянно уменьшать входящий поток данных и выводить новое уменьшенное значение после каждой входящей записи.

Внутренне StreamGroupedReduce использует ValueState, который сохраняет текущее значение уменьшения. Всякий раз, когда поступает новая запись, текущее значение уменьшения объединяется с входящей записью, вызывая ReduceFunction (в вашем случае SumAggregator). Результат этой операции затем сохраняется в ValueState оператора и выводится потребителям нисходящего потока.

Например: входной поток 1, 2, 3, 4, 5 будет генерировать следующий вывод при суммировании: 1, 3, 5, 9, 14.

Если вы хотите, то вы можете реализовать то же поведение с keyBy(0).process(...).

...