繁体   English   中英

apache flink中两个以上流的并集

[英]Union of more than two streams in apache flink

我有一个关于 Apache Flink 中两个以上流的联合的架构问题。

我们有三个甚至更多的流,它们是某种代码书,我们必须用它们来丰富主要的 stream。 Code book 流是压缩的 Kafka 主题。 密码本是不经常改变的东西,例如货币。 主要 stream 是一个快速事件 stream。 我们的目标是用代码书丰富主要的 stream。

我认为有三种可能的方式来做到这一点:

  1. 将所有代码簿合并,然后将其与主 stream 连接,并将扩充数据存储为托管的密钥 state(因此,当来自 kafka 的紧凑事件到期时,我将代码簿保存在状态中)。 这是我现在唯一厌倦的方式。 将 JSON 中的 Kafka 主题消息反序列化到 POJO,例如。 货币、组织单位等。 我用所有代码书制作了一个大包装 class CodebookData,例如:
public class CodebookData {
 private Currency currency;
 private OrganizationUnit organizationUnit
...
}

接下来,我将每个 kafka 主题的传入 stream 映射到这个包装器 class ,然后进行联合:

DataStream<CodebookData> enrichedStream = mappedCurrency.union(mappedOrgUnit).union(mappedCustomer);

当我打印 CodebookData 它是这样填充的

CodebookData{
Currency{populated with data},
OrganizationUnit=null,
Customer=null
}
CodebookData{
Curenncy=null,
OrganizationUnit={populated with data},
Customer=null
}
...

在这里我停下来,因为我有问题如何将此 Codebook stream 与主要 stream 连接并将代码簿数据保存在值 state 中。 我的密码本数据中没有唯一的外键,因为每个密码本都有自己的外键,与主 stream 连接,例如。 货币有currencyId、organizationUnit orgID等。 eg.我想做这样的事情

SingleOutputStreamOperator<CanonicalMessage> enrichedMainStream = mainStream
            .connect(enrichedStream)
            .keyBy(?????)
            .process(new MyKeyedCoProcessFunction());

在 MyCoProcessFunction 中,我将创建 CodebookData 类型的 ValueState。

这是完全错误的还是我可以用这个做点什么,如果它是双重的,我做错了什么?

  1. 第二种方法是通过将一系列双输入 CoProcessFunction 运算符与每个 kafka 事件源级联,但我在某处读到这不是最佳方法。

  2. 第三种方法是广播 state 我不太熟悉。 现在我看到问题,如果我使用 RocksDb 进行检查点和保存点我不确定我是否可以使用广播 state。

我应该使用我目前正在苦苦挣扎的方法一中的其他方法吗?

在许多情况下,您需要像这样进行多个独立的扩充连接,遵循的更好模式是使用扇入/扇出方法,并并行执行所有连接。

像这样,在确保主 stream 上的每个事件具有唯一 ID 之后,您创建每个事件的 3 个或更多副本:

在此处输入图像描述

然后,您可以通过任何适当的方式键入每个副本——货币、组织单位等(或客户、IP 地址,以及我从中获取此图的示例中的商家)——然后将其连接到适当的说明书 stream ,并独立计算每个 2 路连接。

然后将这些并行连接结果流合并在一起,keyBy 您添加到每个原始事件的随机随机数,并将结果粘合在一起。

现在在三个流的情况下,这可能过于复杂。 在那种情况下,我可能只做一系列三个 2 路连接,一个接一个,每次都使用 keyBy 和 connect。 但是在某些时候,随着它们变得更长,以这种方式构建的管道往往会遇到性能/检查点问题。

https://gist.github.com/alpinegizmo/5d5f24397a6db7d8fabc1b12a15eeca6中有一个实现这种扇入/扇出模式的示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM