Apache flink 在Flink中将低延迟流与多个元数据流相结合(扩展)

Apache flink 在Flink中将低延迟流与多个元数据流相结合(扩展),apache-flink,flink-streaming,Apache Flink,Flink Streaming,我正在评估Flink的流式分析场景,还没有找到足够的信息来说明如何实现我们今天在遗留系统中进行的ETL设置 一个非常常见的场景是,我们有一个键控的、低吞吐量的元数据流,我们想用它来丰富高吞吐量的数据流,如下所示: 这就提出了关于Flink的两个问题:如何用时间窗口重叠但不相等的缓慢更新流来丰富快速移动的流(元数据可以存活数天,而数据可以存活数分钟)?如何有效地将多个(最多10个)流与Flink连接起来,比如一个数据流和九个不同的浓缩流 我知道我可以使用非窗口外部ETL缓存实现我的ETL场景,例

我正在评估Flink的流式分析场景,还没有找到足够的信息来说明如何实现我们今天在遗留系统中进行的ETL设置

一个非常常见的场景是,我们有一个键控的、低吞吐量的元数据流,我们想用它来丰富高吞吐量的数据流,如下所示:

这就提出了关于Flink的两个问题:如何用时间窗口重叠但不相等的缓慢更新流来丰富快速移动的流(元数据可以存活数天,而数据可以存活数分钟)?如何有效地将多个(最多10个)流与Flink连接起来,比如一个数据流和九个不同的浓缩流


我知道我可以使用非窗口外部ETL缓存实现我的ETL场景,例如使用Redis(这就是我们今天使用的),但我想看看Flink提供了什么可能性

Flink有几种可用于富集的机制

我将假设所有流共享一个公共密钥,该密钥可用于连接相应的项

最简单的方法可能是使用
RichFlatmap
并在其open()方法()中加载静态扩展数据。这仅适用于浓缩数据是静态的,或者您愿意在需要更新浓缩数据时重新启动浓缩作业的情况

对于下面描述的其他方法,您应该将充实数据存储为托管的键控状态(请参阅)。这将使Flink能够在出现故障时恢复和恢复您的浓缩作业

假设您希望在浓缩数据中实际流式传输,那么
RichCoFlatmap
更合适。这是一个有状态运算符,可用于合并或联接两个连接的流。但是,使用
RichCoFlatmap
时,您无法考虑流元素的计时。例如,如果您担心一个流先于另一个流或落后于另一个流,并且希望以可重复的、确定性的方式执行富集,那么使用a是正确的方法

您将在中找到一个详细的示例以及代码

如果有许多流(例如10个)要连接,则可以级联一系列这两个输入
协处理函数
运算符,但不可否认,这在某些情况下会变得相当尴尬。另一种方法是使用union运算符将所有元数据流组合在一起(注意,这要求所有流具有相同的类型),然后是将此统一的扩展流与主流连接起来的
RichCoFlatmap
协处理函数

更新:

Flink的表和SQL API也可用于流扩展,Flink 1.4通过添加流时间窗口的内部联接扩展了这种支持。见和。例如:

SELECT *
FROM Orders o, Shipments s
WHERE o.id = s.orderId AND
  o.ordertime BETWEEN s.shiptime - INTERVAL '4' HOUR AND s.shiptime

如果发货发生在下订单后的4个订单内,此示例将订单与其相应的发货关联起来。

谢谢!我能够用一组自定义协处理函数和自定义状态管理解决我的用例,基本上解决了Flink在DSL风格API中缺少的两件事:在不同窗口大小上连接两个流(我微管理连接逻辑)和真正的滑动窗口(即不仅仅是重叠的翻滚窗,不幸的是,Flink社区称之为滑动窗)。但是,我相信,Jira中的这两个功能都有问题。很高兴您找到了解决方案。我添加了一个关于使用表和sql API进行时间窗口联接的更新,这可能更适合您的用例。这将在本周晚些时候发布的Flink 1.4中发布。