Предположим, у меня есть конвейер flink как таковой: kafka_source -> maps/filters/keyBy/timewindow(1 minute) -> sinkCassandra
К тому времени, когда сгруппированные сообщения выполнят операцию sinkCassandra
, я гарантирую, что никакие другие слоты не будут одновременно запускать maps/filters/keyBy/timewindow(1 minute)
часть конвейера?
Или возможно, чтобы какой-то другой слот запускал средний конвейер, в то время как другой набор выполняет операцию sinkCassandra?
EDIT (Добавлено больше требований, основанных на диалоге комментариев) :
То, что я пытаюсь сделать, - это эффективно выполнить поиск на основе ключа данных flink из хранилища данных, выполнить обновление и вернуть sh обновленные данные обратно.
Причина почему я уклоняюсь от использования kafka_source -> maps/filters -> keyBy/TimeWindow/statefulReduce -> sinkCassandra
, потому что состояние потенциально может стать огромным (от 1 дня до 7 дней, где я могу разместить 7 дней в качестве максимального ограничения времени), и я не обязательно знаю временное окно для каждого ключа. Это означало бы ОГРОМНОЕ состояние даже при rocksdb.
Другой потенциальный вариант, на который я смотрю, это kafka_source -> maps/filters -> keyBy/sinkCass
, где в рамках пользовательской операции приемника я сначала проверю какой-нибудь буфер в памяти, если я есть ключ, который я хочу обновить. Если нет, то я go вперед и получаю от Кассандры. Каждые 5 секунд (или каждые N секунд) я собирал все, что находится в буфере, и грипп sh в Кассандру. Чтобы ограничить память, я могу создать в памяти наименее недавно использованную хэш-карту (я не обязательно хочу, чтобы flu sh b / c несколько ключей снова появлялись!)