我要求澄清Apache Flink(1.6.0)在通过窗口发送事件后如何处理来自KeyedStreams的事件,并且已经应用了某些运算符(例如reduce()或process())。
假设单个节点集群在执行了键控窗口流上的运算符之后,剩下的只有1个DataStream或者恰好是k个 DataStream(其中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 | ||
---------- | ---------- | ---------- |
编辑(2018-09-22)
基于David的回答,我想我误解了KeyedStreams与窗口或其他流的结合。不知何故,我得到的印象是KeyedStream通过在幕后创建多个流来对传入流进行分区,而不是仅使用相同的流将对象组合在一起。
我以为Flink做的相当于:
List eventsForKey1 = ...;
List eventsForKey2 = ...;
List eventsForKey3 = ...;
...
List eventsForKeyN = ...;
我现在看到Flink实际上做的相当于:
Map> events = ...;
探索各种场景的作业图形的最佳方法是编写一些简单的应用程序,并在Flink附带的仪表板中检查其作业图。
我不确定如何解释你在keyBy之后显示的扇出,这使你难以回答你的问题。如果您询问生成的foo DataStream的并行性,它可以是您想要的任何内容。
如果在keyBy之前和之后并行性为1,那么流将不会像您所示那样被拆分。而是会有一个Window操作符来处理所有键。(并行性与键的数量无关,尽管键控操作符 - 例如滑动窗口及其缩减功能 - 无法利用大于键数的并行度。)
但即使在单个节点中,您也可以拥有多个内核,并将窗口运算符的并行度设置为3.如果这是您想要的,则后续运算符可以并行处理reduce函数的结果。但无论并行性如何,您工作的那部分只会有一个DataStream(foo)。
如果我误解了它,请更新你的问题,我会再试一次。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。