首页 文章

Flink流媒体 - 笛卡儿产品和流媒体窗口

提问于
浏览
0

假设我有一个包含密钥和时间戳的流 . 我想在每个窗口(滑动窗口)中创建这些键的笛卡尔积 . 如果我有密钥1,2,3,4并且我将并行性设置为2,我想以下列方式“分组”它们:

1 - 2    2 - 3
1 - 3    2 - 4
1 - 4    3 - 4

我希望每个窗口按组处理元素 . 因此,假设上述元素(1,2,3,4)基于它们的时间戳位于同一窗口中 .

在最简单的形式中,我的问题是:给定每个滑动窗口中的一些元素(可能包含多个键),我想创建这些键的组合,如上例所示,并在这些分组元素上应用自定义算法 .

我到目前为止所尝试的是使用

.assignAscendingTimestamps(...)
.keyBy(...)
.timeWindow(Time.seconds(5),Time.seconds(5))
.apply(...)

但这只会为每个键应用一个算法,加上无法创建组合 .

P.S . :我看过这个文件:https://cwiki.apache.org/confluence/display/FLINK/Streams+and+Operations+on+Streams

而且我认为那里提到的离散流可以解决问题,但它们在flink 1.2(或任何其他版本)中不可用 .

1 回答

  • 2

    流式上下文中的 keyBy() 与批处理上下文中的 groupBy() 具有相似的效果 . 根据您提供的 KeySelector ,流被分区为多个子流 . 然后将它们输入你的 timeWindow . 因此,你目前在你的例子中所做的是一个 timeWindow KeyedStream . 进入 timeWindow 并被发送到您之后应用的函数中的所有元素将具有完全相同的键 . 这里有一个很好的Flink窗口介绍,详细介绍了如何使用windows https://flink.apache.org/news/2015/12/04/Introducing-windows.html . 如果您的密钥包含语义信息,并且您希望在同一窗口中具有不同的密钥,则可以创建分配给记录的人工密钥(例如,简单整数) . 基于此密钥,您可以更好地控制分组,从而实现流分区 . 对于获取前面步骤结果并加入它们的最终计算,您需要一个额外的步骤(例如 joinreduce ) . 看一下这里的第一个例子:https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/datastream_api.html使用 sum() 函数计算具有给定键的所有元素在 timeWindow 上的5秒 . 每个窗口的每个键包含一个元素 .

相关问题