开发者社区> 问答> 正文

窗口操作员行为澄清后的Apache Flink KeyedStream

我要求澄清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小助手 2018-12-10 11:19:08 2084 0
1 条回答
写回答
取消 提交回答
  • flink小助手会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关flink的问题及回答。

    探索各种场景的作业图形的最佳方法是编写一些简单的应用程序,并在Flink附带的仪表板中检查其作业图。

    我不确定如何解释你在keyBy之后显示的扇出,这使你难以回答你的问题。如果您询问生成的foo DataStream的并行性,它可以是您想要的任何内容。

    如果在keyBy之前和之后并行性为1,那么流将不会像您所示那样被拆分。而是会有一个Window操作符来处理所有键。(并行性与键的数量无关,尽管键控操作符 - 例如滑动窗口及其缩减功能 - 无法利用大于键数的并行度。)

    但即使在单个节点中,您也可以拥有多个内核,并将窗口运算符的并行度设置为3.如果这是您想要的,则后续运算符可以并行处理reduce函数的结果。但无论并行性如何,您工作的那部分只会有一个DataStream(foo)。

    如果我误解了它,请更新你的问题,我会再试一次。

    2019-07-17 23:19:06
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Flink CDC Meetup PPT - 龚中强 立即下载
Flink CDC Meetup PPT - 王赫 立即下载
Flink CDC Meetup PPT - 覃立辉 立即下载

相关镜像