我正在为流分析方案评估Flink,并且还没有找到关于如何实现我们今天在遗留系统中所做的一种ETL设置的足够信息。
一个非常常见的场景是,我们使用了关键的、慢吞吐量的元数据流,我们希望使用这些数据流在高吞吐量数据流上进行丰富,如下所示:

这就引出了两个关于Flink的问题:如何通过缓慢更新时间窗口重叠但不相等的流来丰富快速移动的流(元数据可以存活数日,而数据可以存活几分钟)?如何有效地将多个(最多10个)数据流与Flink连接起来,比如一个数据流和9个不同的富集流?
我知道我可以使用非窗口的外部ETL缓存来实现我的ETL场景,例如使用Redis (这是我们今天使用的),但我想看看Flink提供了哪些可能性。
发布于 2017-11-27 09:49:38
Flink有几种可以用于浓缩的机制。
我将假设所有流共享一个可用于连接相应项的公共密钥。
最简单的方法可能是使用RichFlatmap并在其open()方法(关于富函数的文档)中加载静态富集数据。这只有在浓缩数据是静态的情况下,或者当您想要更新浓缩数据时愿意重新启动浓缩作业时,才适合这样做。
对于下面描述的其他方法,您应该将充实数据存储为托管的键控状态(请参阅关于在Flink中使用状态的文档)。这将使Flink能够在失败的情况下恢复和恢复您的浓缩工作。
假设您实际上想要在充实数据中进行流,那么RichCoFlatmap就更合适了。这是一个有状态操作符,可用于合并或连接两个连接的流。但是,对于RichCoFlatmap,您无法考虑流元素的时间安排。例如,如果关注一个流领先于另一个流,或落后于另一个流,并且希望以可重复的、确定性的方式执行富集,那么使用CoProcessFunction是正确的方法。
您将在Apache Flink培训材料中找到一个详细的示例和代码。
如果您有许多流(例如,10)要加入,您可以级联一系列这两个输入的CoProcessFunction操作符,但这确实会在某个时候变得相当尴尬。另一种方法是使用联合操作符将所有元数据流(注意,这要求所有流具有相同的类型)组合在一起,然后是一个RichCoFlatmap或CoProcessFunction,它将这个统一的富集流与主流连接起来。
更新:
Flink的Table和SQL也可以用于流丰富,Flink 1.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个订单内,则此示例将将订单与相应的货件连接起来。
https://stackoverflow.com/questions/47408322
复制相似问题