Итак, я столкнулся с этой, кажется, классической c -проблемой, извлеките временные вершины для неограниченного потока,
используя Apache Beam (Flink в качестве движка):
Предполагается, что сайты + вводимые кортежи совпадений:
{"aaa.com", 1001}, {"bbb.com", 21}, {"aaa.com", 1002}, {"ccc .com ", 3001}, {" bbb.com ", 22} ....
(Ожидаемая скорость: + 100K записей в час)
Цель состоит в том, чтобы выводить сайты, которые составляют> 1% от общего числа попаданий в каждый 1 час.
т.е. для 1-часового окна исправлений выберите сайт, который в сумме составляет> 1% от общего числа совпадений.
Итак, сначала, сумма по ключу:
{"aaa.com", 2003}, {"bbb.com", 43}, {"ccc .com", 3001} ....
И, наконец, выведите> 1%:
{"aaa.com"}, {"ccc .com"}
Альтернатива:
1) Group + parDo :
Фиксированное временное окно 1 час, сгруппировать все элементы, следуя повторяемому parDo для всех элементов окна,
вычислить сумму и вывести сайты> 1%.
Кажется, против быть все агро ess выполняется в одном потоке и, похоже, требует двойных итераций, чтобы получить сумму и получить> 1%.
2) GroupByKey + Combine
Фиксированное временное окно 1 час, GrouByKey с использованием ключа = Сайт, применяющий Объединение с настраиваемым аккумулятором для суммирования совпадений для каждой клавиши.
Хотя вариант «Объединить» (# 2) кажется более подходящим,
мне не хватает части , попадающей в сумму за -1-часовое окно, , необходимое для вычисления элементов>% 1:
Можно ли использовать одно и то же окно для двух комбинаций: одно для каждой клавиши и одна общая сумма совпадений в этом окне?
и как лучше всего их объединить, чтобы сделать вызов> 1% на элемент?
10x