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

weylhg0b  于 2021-06-25  发布在  Flink
关注(0)|答案(1)|浏览(304)

我正在评估flink的流分析场景,还没有找到足够的信息来说明如何实现一种etl设置,我们现在正在一个遗留系统中进行。
一个非常常见的场景是,我们有一个键控的、低吞吐量的元数据流,我们想用它来丰富高吞吐量的数据流,如下所示:

这就提出了关于flink的两个问题:如何用时间窗口重叠但不相等的缓慢更新流来丰富快速移动的流(元数据可以生存几天,而数据可以生存几分钟)?如何有效地将多个(最多10个)流与flink连接起来,比如一个数据流和九个不同的富集流?
我知道我可以用无窗口的外部etl缓存来实现etl场景,例如redis(这是我们今天使用的),但是我想看看flink提供了什么可能性。

z3yyvxxp

z3yyvxxp1#

Flink有几种可用于浓缩的机制。
我将假设所有流共享一个公共密钥,该密钥可用于连接相应的项。
最简单的方法可能是使用 RichFlatmap 并在其open()方法(docs about rich functions)中加载静态扩展数据。这仅适用于扩展数据是静态的,或者您愿意在需要更新扩展数据时重新启动扩展作业的情况。
对于下面描述的其他方法,您应该将扩展数据存储为托管的键控状态(请参阅关于在flink中使用状态的文档)。这将使flink能够在失败的情况下恢复和恢复您的扩展工作。
假设您真的想在浓缩数据流,那么 RichCoFlatmap 更合适。这是一个有状态运算符,可用于合并或联接两个连接的流。但是 RichCoFlatmap 您没有能力考虑流元素的计时。例如,如果您担心一个流先于或落后于另一个流,并且希望以可重复的、确定的方式执行充实,那么使用 CoProcessFunction 是正确的方法。
您将在apache flink培训资料中找到一个详细的示例和代码。
如果有许多流(例如10个)要连接,可以级联这两个输入的一系列 CoProcessFunction 但不可否认,这在某种程度上确实变得相当尴尬。另一种方法是使用union操作符将所有元数据流组合在一起(注意,这要求所有流具有相同的类型),然后使用 RichCoFlatmap 或者 CoProcessFunction 把这个统一的浓缩流和主流连接起来。
更新:
flink的表和SQLAPI也可以用于流丰富,Flink1.4通过添加流时间窗口的内部连接扩展了这种支持。请参见表api联接和sql联接。例如:

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

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

相关问题