【问题标题】:Apache Flink KeyedStream after window operator behavior clarificationApache Flink KeyedStream 后窗口操作员行为澄清
【发布时间】: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


    【解决方案1】:

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

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

    如果在 keyBy 之前和之后的并行度都是 1,那么流就不会像您展示的那样被拆分。相反,将有一个处理所有键的 Window 运算符。 (并行度与键的数量无关,尽管键控操作符——比如你的滑动窗口和它的 reduce 函数——不能利用大于键数量的并行度。)

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

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

    【讨论】:

      【解决方案2】:

      认为你真正要问的是你是否在reduce 操作之后得到KeyedStream。如果是这样,那么答案是否定的,你会得到一个普通的DataStream

      虽然可以通过DataStreamUtils.reinterpretAsKeyedStream(DataStream, KeySelector) 将其转换回KeyedStream,但如果您注意确保没有更改用于创建窗口键的字段值。

      【讨论】:

        猜你喜欢
        • 2022-11-16
        • 1970-01-01
        • 2019-05-25
        • 2021-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多