Flink: как понять, сколько существует экземпляров параллельных операторов? - PullRequest
0 голосов
/ 08 июля 2019

У меня есть 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;
    }
}

Есть ли способ узнать, сколько существует экземпляров параллельного оператора и какой это оператор? Есть ли другой способ добиться того, чего я добиваюсь?

1 Ответ

2 голосов
/ 08 июля 2019

Если вы используете RichFlatMapFunction, вы получите доступ к RuntimeContext через getRuntimeContext(). RuntimeContext имеет два метода, которые вам нужны:

  • getNumberOfParallelSubtasks ()
  • getIndexOfThisSubtask ()

Надеюсь, это поможет.

...