Flink:如何了解并行运算符的实例数量?

时间:2019-07-08 10:19:38

标签: java apache-flink flink-streaming

我有一个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 个答案:

答案 0 :(得分:2)

如果您使用getUserFromLogin(email: string, password: string): Observable<User> { return this.http.post<HttpResponse<User>>(`${this.url}/auth/login`, { email, password }, { observe: 'response' }).pipe( map(response => { ... response.headers.keys(); // all header names ... response.body // response content ... return response.body; }) ) ) ,则可以通过RichFlatMapFunction访问RuntimeContextgetRuntimeContext()具有您需要的两种方法:

  • getNumberOfParallelSubtasks()
  • getIndexOfThisSubtask()

希望这会有所帮助。