首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Flink中的低延迟流与多个元数据流的结合(丰富)

Flink中的低延迟流与多个元数据流的结合(丰富)
EN

Stack Overflow用户
提问于 2017-11-21 08:20:55
回答 1查看 1.7K关注 0票数 1

我正在为流分析方案评估Flink,并且还没有找到关于如何实现我们今天在遗留系统中所做的一种ETL设置的足够信息。

一个非常常见的场景是,我们使用了关键的、慢吞吐量的元数据流,我们希望使用这些数据流在高吞吐量数据流上进行丰富,如下所示:

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-27 09:49:38

Flink有几种可以用于浓缩的机制。

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

最简单的方法可能是使用RichFlatmap并在其open()方法(关于富函数的文档)中加载静态富集数据。这只有在浓缩数据是静态的情况下,或者当您想要更新浓缩数据时愿意重新启动浓缩作业时,才适合这样做。

对于下面描述的其他方法,您应该将充实数据存储为托管的键控状态(请参阅关于在Flink中使用状态的文档)。这将使Flink能够在失败的情况下恢复和恢复您的浓缩工作。

假设您实际上想要在充实数据中进行流,那么RichCoFlatmap就更合适了。这是一个有状态操作符,可用于合并或连接两个连接的流。但是,对于RichCoFlatmap,您无法考虑流元素的时间安排。例如,如果关注一个流领先于另一个流,或落后于另一个流,并且希望以可重复的、确定性的方式执行富集,那么使用CoProcessFunction是正确的方法。

您将在Apache Flink培训材料中找到一个详细的示例和代码。

如果您有许多流(例如,10)要加入,您可以级联一系列这两个输入的CoProcessFunction操作符,但这确实会在某个时候变得相当尴尬。另一种方法是使用联合操作符将所有元数据流(注意,这要求所有流具有相同的类型)组合在一起,然后是一个RichCoFlatmapCoProcessFunction,它将这个统一的富集流与主流连接起来。

更新:

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

代码语言:javascript
运行
复制
SELECT *
FROM Orders o, Shipments s
WHERE o.id = s.orderId AND
  o.ordertime BETWEEN s.shiptime - INTERVAL '4' HOUR AND s.shiptime

如果货物发生在下订单后的4个订单内,则此示例将将订单与相应的货件连接起来。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47408322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档