Apache flink 窗口操作符行为澄清后的Apache Flink KeyedStream
我请求澄清在事件通过窗口发送并应用了某些操作符(如reduce()或process())之后,Apache Flink(1.6.0)如何处理来自KeyedStreams的事件 假设一个单节点集群,在执行键控窗口流上的一个操作符后,剩下的是正好1个数据流还是正好k个数据流(其中k是键的唯一值的数量)Apache flink 窗口操作符行为澄清后的Apache Flink KeyedStream,apache-flink,partitioning,flink-streaming,sliding-window,topography,Apache Flink,Partitioning,Flink Streaming,Sliding Window,Topography,我请求澄清在事件通过窗口发送并应用了某些操作符(如reduce()或process())之后,Apache Flink(1.6.0)如何处理来自KeyedStreams的事件 假设一个单节点集群,在执行键控窗口流上的一个操作符后,剩下的是正好1个数据流还是正好k个数据流(其中k是键的唯一值的数量) 为澄清,考虑需要从某个源读取事件,通过一些K键,将键事件发送到一些窗口流,减少,然后做很多其他事情。下面两个图中,哪一个是实际构建的 图形A |-------
为澄清,考虑需要从某个源读取事件,通过一些K键,将键事件发送到一些窗口流,减少,然后做很多其他事情。下面两个图中,哪一个是实际构建的
图形A |--------------|
| source |
| (DataStream) |
|--------------|
|
[all events]
|
v
|--------------|
| key by( k ) |
| (KeyedStream)|
|--------------|
/ | \
/ | \
[ k = 1 ] [ k = 2 ] [ k = 3 ]
/ | \
/ | \
v v v
|------------------||------------------||------------------|
| sliding window || sliding window || sliding window |
| (WindowedStream) || (WindowedStream) || (WindowedStream) |
|------------------||------------------||------------------|
| | |
[ k = 1 ] [ k = 2 ] [ k = 3 ]
| | |
v v v
|----------| |----------| |----------|
| reduce | | reduce | | reduce |
|----------| |----------| |----------|
| | |
[ k = 1 ] [ k = 2 ] [ k = 3 ]
| | |
v v v
|--------------| |--------------| |--------------|
| foo | | foo | | foo |
| (DataStream) | | (DataStream) | | (DataStream) |
|--------------| |--------------| |--------------|
图B
|--------------|
| source |
| (DataStream) |
|--------------|
|
[all events]
|
v
|--------------|
| key by( k ) |
| (KeyedStream)|
|--------------|
/ | \
/ | \
[ k = 1 ] [ k = 2 ] [ k = 3 ]
/ | \
/ | \
v v v
|------------------||------------------||------------------|
| sliding window || sliding window || sliding window |
| (WindowedStream) || (WindowedStream) || (WindowedStream) |
|------------------||------------------||------------------|
| | |
[ k = 1 ] [ k = 2 ] [ k = 3 ]
| | |
v v v
|----------| |----------| |----------|
| reduce | | reduce | | reduce |
|----------| |----------| |----------|
\ | /
\ | /
\ | /
\ | /
\ | /
\ | /
\ | /
[all products]
|
v
|--------------|
| foo |
| (DataStream) |
|--------------|
编辑(2018-09-22)
基于David的回答,我认为我误解了KeyedStreams与窗口或其他流的结合方式。不知怎的,我得到了这样的印象:KeyedStream通过在幕后创建多个流来划分传入流,而不是使用同一个流根据某个值将对象分组在一起
我以为弗林克在做的事情相当于:
List<Foo> eventsForKey1 = ...;
List<Foo> eventsForKey2 = ...;
List<Foo> eventsForKey3 = ...;
...
List<Foo> eventsForKeyN = ...;
Map<Key, List<Foo>> events = ...;
List eventsForKey1=。。。;
列出事件orkey2=。。。;
列出事件标记3=。。。;
...
列出事件rkeyn=。。。;
我现在看到,弗林克实际上在做的是:
List<Foo> eventsForKey1 = ...;
List<Foo> eventsForKey2 = ...;
List<Foo> eventsForKey3 = ...;
...
List<Foo> eventsForKeyN = ...;
Map<Key, List<Foo>> events = ...;
Map事件=。。。;
探索各种场景下的工作图的最佳方式是编写一些简单的应用程序,并在Flink附带的仪表板中检查它们的工作图
我不知道如何解释你在按键后显示的扇出,这使得回答你的问题变得困难。如果您询问生成的foo数据流的并行性,它可以是您想要的任何形式
如果keyBy前后的并行度都是1,那么流将不会像您所示那样被分割。相反,将有一个单独的窗口操作符来处理所有的键。(并行性与关键点的数量无关,尽管已设置关键点的操作符(如滑动窗口及其reduce函数)不能利用大于关键点数量的并行性。)
但是,即使在单个节点中,也可以有多个核心,并将窗口操作符的并行度设置为3。如果你想要的话,reduce函数的结果可以被后续的操作符并行处理。但不管并行性如何,您的作业的这一部分将只有一个数据流(foo)
如果我误解了您的问题,请更新您的问题,我会再试一次。我想您真正想问的是,您是否会在reduce
操作之后使用KeyedStream
。如果是这样,那么答案是否定的,您将得到一个常规的数据流
尽管可以通过datastreamits.reinterpretAsKeyedStream(DataStream,KeySelector)
将其转换回KeyedStream
,但前提是您要小心确保没有更改用于创建窗口键的字段值