我正在评估Flink的流媒体分析方案,并且没有找到足够的信息来说明如何实现我们今天在遗留系统中进行的一种ETL设置。
一个非常常见的情况是我们有关键的,慢速的吞吐量,我们想要用于丰富高吞吐量数据流的元数据流,这些内容包括:
这提出了两个关于Flink的问题:如何通过缓慢更新时间窗口重叠但不相等的流来丰富快速流动的流(元数据可以存活数天而数据存活数分钟)?如何使用Flink有效地连接多个(最多10个)流,比如说一个数据流和九个不同的浓缩流?
我知道我可以使用非窗口外部ETL缓存来实现我的ETL场景,例如使用Redis(我们今天使用的),但我想看看Flink提供的可能性。
答案 0 :(得分:2)
Flink有几种可用于浓缩的机制。
我将假设所有流共享一个可用于加入相应项目的公共密钥。
最简单的方法可能是使用RichFlatmap
并在其open()方法(docs about rich functions)中加载静态浓缩数据。这仅适用于浓缩数据是静态的,或者如果您愿意在需要更新浓缩数据时重新启动浓缩作业。
对于下面描述的其他方法,您应该将浓缩数据存储为托管,键控状态(请参阅docs about working with state in Flink)。这将使Flink能够在发生故障时恢复和恢复您的浓缩工作。
假设您想要实际流式传输浓缩数据,那么RichCoFlatmap
更合适。这是一个有状态运算符,可用于合并或连接两个连接的流。但是,对于RichCoFlatmap
,您无法将流元素的计时考虑在内。例如,如果关注一个流先于或反过来,并希望以可重复的,确定的方式执行丰富,那么使用CoProcessFunction
是正确的方法。
您可以在Apache Flink training materials。
中找到详细示例和代码如果要加入很多流(例如10个),可以级联一系列这两个输入CoProcessFunction
运算符,但这确实在某些时候变得相当尴尬。另一种方法是使用union运算符将所有元数据流组合在一起(请注意,这要求所有流具有相同的类型),然后是RichCoFlatmap
或CoProcessFunction
加入这个统一的浓缩流与主流。
更新
Flink的表和SQL API也可以用于流丰富,Flink 1.4通过添加流时间窗口内连接来扩展此支持。请参阅Table API joins和SQL joins。例如:
SELECT *
FROM Orders o, Shipments s
WHERE o.id = s.orderId AND
o.ordertime BETWEEN s.shiptime - INTERVAL '4' HOUR AND s.shiptime
如果货件发生在订单的4个订单范围内,此示例将订单与相应的货件连接。