Совместное использование состояния подзадачи оператора с использованием побочных выходов - PullRequest
0 голосов
/ 18 февраля 2020

Я реализую потоковое приложение, и один из операторов с сохранением состояния пытается перехватить отношение «владелец имеет элементы». Состояние, указанное для каждого владельца, состоит из сведений о владельце и каждом из элементов. Владение предметом может измениться, и я хотел бы иметь возможность связать каждый предмет с его правильным владельцем. Поскольку состояние оператора для разных владельцев может находиться в разных подзадачах, и эти подзадачи предназначены для работы независимо, я хочу знать, каков наилучший способ поделиться состоянием. Одним из решений, которое я смог придумать, было создание ключевого потока данных из побочного вывода подзадачи и его отправка правильному владельцу и очистка состояния от исходного владельца. По существу:

  1. Подзадача1 с состоянием о OldOwner, у которого есть Item1, Item2,…, ItemN
  2. Subtask1 пишет в сообщение для вывода на стороне (OldOwner, NewOwner, List [ItemsToTransfer])
  3. (Необязательно) Очистить состояние списка List [ItemsToTransfer] из состояния о OldOwner.
  4. Создать поток данных из побочного вывода и отправить его обратно тому же оператору, но потенциально другой подзадаче, которая имеет состояние о NewOwner.
  5. Обновите состояние NewOwner, добавив новый набор элементов

Поскольку боковые выходы предназначены для совсем другой цели (ведение журнала и т. Д. c.), Я хочу знать, будет ли это работать. Применяются ли те же гарантии отказоустойчивости к побочным выходам, что и к обычным потокам данных? Существует ли ограничение на количество сторонних выходных сообщений, которые можно буферизовать в подзадаче?

Альтернативный подход может заключаться в том, чтобы взять выходные данные первой подзадачи и передать их тому же оператору. Оба этих подхода, теоретически, нарушают свойство того, что задание flink является DAG, хотя для моего случая использования никогда не было бы циклической передачи данных c.

1 Ответ

0 голосов
/ 18 февраля 2020

Ваше предложение создаст цикл в топологии, потому что вам нужно отправлять события из побочного вывода обратно в одну и ту же / другую подзадачу одного и того же оператора.

Что вам действительно нужно, так это поддержка нескольких ключевые / мульти-состояния транзакций в Flink. Сам Flink не имеет встроенной поддержки для него. Тем не менее, Flink предоставляет все инструменты, необходимые для создания такой функции поверх него. Фактически, потоковая книга делает именно это. Это позволяет вам выполнять транзакции с несколькими состояниями с единовременной обработкой гарантии поверх Flink.

...