Apache Beam недавно представил ячейки состояний с помощью аннотаций StateSpec
и @StateId
с частичной поддержкой в Apache Flink и Google Cloud Dataflow.
Мой вопрос касается сборки мусора состояния в случае, когда DoFn с отслеживанием состояния используется в оконном потоке. Обычно состояние удаляется (сборщик мусора) бегуном по истечении срока действия окна (т. Е. Водяной знак проходит через конец окна). Однако рассмотрим случай, когда оконные панели срабатывают раньше, а сработавшие панели отбрасываются:
input.apply(Window.<MyElement>into(CalendarWindows.days(1))
.triggering(AfterWatermark.pastEndOfWindow()
.withEarlyFirings(
AfterProcessingTime.pastFirstElementInPane()
.plusDelayOf(Duration.standardMinutes(10))
))
.discardingFiredPanes()
.apply(ParDo.of(new MyStatefulDofn()));
В этом случае будет ли состояние ключей, которые были запущены раньше, сохраняться до истечения срока действия окна? т.е. будут ли последующие панели в том же окне иметь доступ к состоянию, записанному более ранними панелями?
Ваша конфигурация запуска не влияет на то, как выполняется обработка
ParDo
с отслеживанием состояния. Элементы сразу же передаются вашемуDoFn
без какой-либо буферизации / запуска, и вашDoFn
напрямую контролирует, когда происходит вывод.Тот факт, что вы управляете выводом, является важным различием между
ParDo
обработкой с сохранением состояния иCombine.perKey
управляемой триггерами. Вот почемуParDo
с отслеживанием состояния часто является хорошим выбором, когда триггеры недостаточно богаты для вашего варианта использования.Я сравниваю обработку
ParDo
с отслеживанием состояния с триггерамиCombine
+ более подробно в моем сообщении в блоге Beam: https://beam.apache.org/blog/2017/02/13/stateful-processing.htmlТеперь, если есть
GroupByKey
илиCombine.perKey
где-то выше по течению от вашегоParDo
с отслеживанием состояния, тогда элементы ввода будут связаны с некоторым запуском триггера из восходящего потока. Но это не влияет на управление состояниемParDo
с отслеживанием состояния. Поскольку состояние сохраняется для всех элементов, а «панель» — это просто элемент, состояние сохраняется до тех пор, пока окно не истечет полностью.Между прочим, очень хорошее резюме, ведущее к вашему вопросу!