我要求澄清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 = ...;
我想你真正想问的是,在reduce
操作之后是否会出现KeyedStream
。如果是这样,那么答案是否定的,您将得到一个常规的数据流。
尽管可以通过
DataStreamUtils实现。重新解释skeyedstream(DataStream,KeySelector)
以将其转换回KeyedStream
,前提是您要小心确保没有更改用于创建窗口键的字段值。
探索各种场景下作业图的最佳方式是编写一些简单的应用程序,并在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