【发布时间】:2019-02-26 04:41:12
【问题描述】:
我要求澄清 Apache Flink (1.6.0) 在通过窗口发送事件并且应用了某些运算符(例如 reduce() 或 process())之后如何处理来自 KeyedStreams 的事件。
假设一个单节点集群,在一个键控窗口流上的操作符被执行后,剩下的正好是 1 个 DataStreams 或正好是 k 个 DataStreams(其中 k 是键的唯一值的数量)?
为澄清起见,考虑需要从某个源读取事件,通过某个 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 通过在幕后创建多个流来对传入流进行分区,而不是使用同一流按某个值将对象分组在一起。
我认为 Flink 所做的相当于:
List<Foo> eventsForKey1 = ...;
List<Foo> eventsForKey2 = ...;
List<Foo> eventsForKey3 = ...;
...
List<Foo> eventsForKeyN = ...;
我现在看到 Flink 实际上是在做相当于:
Map<Key, List<Foo>> events = ...;
【问题讨论】:
标签: apache-flink partitioning flink-streaming sliding-window topography