【问题标题】:Union of more than two streams in apache flinkapache flink中两个以上流的联合
【发布时间】:2021-04-06 22:39:41
【问题描述】:

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

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

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

  1. 将所有码本合并,然后加入主流并存储 丰富数据作为托管的键控状态(所以当来自 kafka 的紧凑事件到期时,我有 保存在状态中的密码本)。这是我现在唯一厌倦的方式。 以 JSON 格式到 POJO 的反序列化 Kafka 主题消息,例如。货币、组织单位等。 我用所有代码书制作了一个大型包装类 CodebookData,例如:
public class CodebookData {
 private Currency currency;
 private OrganizationUnit organizationUnit
...
}

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

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 流与主流连接并将 Codebook 数据保存为值状态。 我的 Codebook 数据中没有唯一的外键,因为每个 Codebook 都有它的与主流连接的自己的外键,例如。货币有currencyId、organizationUnit orgID 等。 eg.我想做这样的事情

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

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

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

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

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

我应该使用我目前正在苦苦挣扎的方法 1 之外的其他方法吗?

【问题讨论】:

    标签: java apache-kafka apache-flink flink-streaming


    【解决方案1】:

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

    类似这样,在确保主流上的每个事件都有一个唯一的 ID 之后,您为每个事件创建 3 个或更多副本:

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

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

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

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

    【讨论】:

    • 感谢这工作。我想知道在使用一系列连接连接时,您是否有一些关于性能不佳/检查点问题的链接?
    • 我无法举出任何公开的例子,但我见过一些公司各自建立了一个超过 10 个连接的连接链。他们都对这种方法有一些问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多