当前位置: 首页 > 知识库问答 >
问题:

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

穆阳炎
2023-03-14

我要求澄清Apache Flink(1.6.0)在事件通过窗口发送并应用了一些运算符(如减少()或过程())后,如何处理来自KeyedStreams的事件。

假设一个单节点集群,在执行键控窗口流上的一个操作符后,剩下的是正好1个数据流还是正好k个数据流(其中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 = ...;

共有2个答案

鲜于光赫
2023-03-14

我想你真正想问的是,在reduce操作之后是否会出现KeyedStream。如果是这样,那么答案是否定的,您将得到一个常规的数据流。

尽管可以通过DataStreamUtils实现。重新解释skeyedstream(DataStream,KeySelector)以将其转换回KeyedStream,前提是您要小心确保没有更改用于创建窗口键的字段值。

司马自明
2023-03-14

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

我不知道如何解释你在key By之后显示的扇出,这使得回答你的问题变得困难。如果您正在询问由此生成的foo DataStream的并行性,它可以是您想要的任何内容。

如果keyBy前后的并行度都是1,那么流将不会像您所示那样被分割。相反,将有一个单独的窗口操作符来处理所有的键。(并行性与关键点的数量无关,尽管已设置关键点的操作符(如滑动窗口及其reduce函数)不能利用大于关键点数量的并行性。)

但是,即使在单个节点中,也可以有多个核心,并将窗口操作符的并行度设置为3。如果你想要的话,reduce函数的结果可以被后续的操作符并行处理。但不管并行性如何,您的作业的这一部分将只有一个数据流(foo)。

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

 类似资料:
  • 目前,在单元测试中,我有一个循环可以循环到1000次,如果分数没有更新,那么我假设这个数字可以连续滚动1000次,这是不可能的!不过,我凭空选择了1000这个数字。我想根据Java的随机类的实际行为选择一个更准确的数字。 从读到它所说的API时,它说它是“一个线性同余伪随机数生成器..”。我试图确定的是,基于它使用一个48位,是否有几次相同的值是不可能重复的。例如。在我的场景中,数字1-6可以生成

  • Storm core 支持处理落在窗口内的一组元组。窗口操作指定了一下两个参数 1.窗口的长度 - 窗口的长度或持续时间 2.滑动间隔 - 窗口滑动的时间间隔 滑动窗口 元组被分组在窗口和每个滑动间隔窗口中。 一个元组可以属于多个窗口。 例如一个持续时间长度为 10 秒和滑动间隔 5 秒的滑动窗口。 ........| e1 e2 | e3 e4 e5 e6 | e7 e8 e9 |..

  • 问题内容: 我有一张桌子Table1 当我使用以下查询查询该表时 我得到的输出为 但是以同样的方式,当我使用以下查询时,我没有任何输出。 有人请给我指导,为什么它会那样工作,以及如何使用rownum。 问题答案: 汤姆回答了许多与Oracle有关的问题 简而言之,在应用where子句之后和应用order by子句之前,rownum可用。 在RowNum = 2的情况下,where子句中的谓词将永远

  • 问题内容: 我只是在某处读到,具有与常见项目常量的接口是不好的做法,也称为“ 常量接口反模式”。如果我正确理解这一点,提供的原因是,一旦实现,该类将向公众公开这些常量。 好吧,我首先不理解“实施”的必要性。是否可以直接使用这些静态常量?那么,为什么我必须经历什么时候才能做类似的事情: 我将不胜感激任何指导,以帮助我更多地了解这一点。 问题答案: 我意识到……如果需要的话,该接口可以由个人实现,从而

  • 问题内容: (学问) 根据 维基百科 ,有3种类型的多态性: 临时多态性 指可以应用于不同类型参数的多态函数,但其​​行为取决于所应用参数的类型而有所不同 换句话说:重载: 参数多态性 允许以通用方式编写函数或数据类型,以便它可以相同地处理值而无需依赖其类型 换句话说:泛型 范例: 亚型多态性 允许将函数编写为采用某种类型T的对象,但如果传递了属于类型T的子对象S的对象,则该函数也可以正常工作 (

  • 我不确定负载平衡如何与入口一起工作<如果我理解正确,实际情况是这样的: 我看不到负载平衡是如何执行的<我画的上述方案有什么错<你能帮我纠正一下吗? 注意: -以下答案告诉我入口控制器本身属于“loadbalancer”类型:入口服务类型 -我使用kind ClusterIP,因为我不想将loadbalancer暴露给外部世界。以下文章不支持此声明,其中负载平衡器将由服务提供: https://me