У меня есть KeyedStream для разделения потока событий по ключу. Каждый поток с ключами будет генерировать события, которые затем необходимо будет объединить со всеми другими событиями от других операторов с ключами, чтобы сформировать один граф, который будет существовать в состоянии Flink.
Затем необходимо обработать / найти график и, возможно, отправить события вниз по течению. Я хочу, чтобы оператор графа мог масштабироваться по горизонтали, т. Е. Каждый параллельный оператор обрабатывал подмножество графа (но для этого у каждого оператора должен был бы быть доступ ко всему графу). Меня интересует, как я могу распределить нагрузку по всем параллельным операторам.
// key input events for processing by key
KeyedStream<MyEvent> keyedStream = myInputStream.keyBy(...);
// process each keyed input stream and produce output events that need to be combined into a graph
SingleOutputStreamOperator<MyGraphEvent> graphStream = keyedStream.process(...));
// recombine into a single graph operator via broadcast(), then process
DataStream<MyOutputEvent> output = graphStream.broadcast().flatMap(new MyGraphFlatmapFunction());
Я думаю, что могу использовать broadcast()
, чтобы гарантировать, что все выходные данные каждого из ключевых операторов отправляются каждому последующему оператору.
MyGraphFlatmapFunction
принимает поток объектов MyGraphEvent
, создает график во внутреннем состоянии и дополнительно создает поток объектов MyOutputEvent
. Я хочу, чтобы каждый параллельный оператор обрабатывал подмножество графа. Независимо от количества параллельных экземпляров оператора, я бы хотел, чтобы весь граф обрабатывался (то есть я не хочу, чтобы каждый оператор просто обрабатывал какое-то случайное подмножество графа), и я не хочу параллельные операторы обрабатывают одну и ту же часть графика (без дублирования).
Я бы хотел иметь возможность что-то сделать в MyGraphFlatmapFunction
, например:
int index;
// I want to get the operator instance number & the number of parallel operators in the stream topology
int operatorIndex = getOperatorIndex();
int operatorCount = getTotalNumberOfParallelOperators();
// process every nth object
for (index = 0; index < someCollection.size(); index++) {
if (index % operatorCount == operatorIndex) {
// do some processing
} else {
continue;
}
}
Есть ли способ узнать, сколько существует экземпляров параллельного оператора и какой это оператор? Есть ли другой способ добиться того, чего я добиваюсь?