首页 文章

在Flink(富集)中将低延迟流与多个元数据流相结合

提问于
浏览
1

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

一个非常常见的情况是,我们有密钥,慢速吞吐量,我们想要用于丰富高吞吐量数据流的元数据流,这些内容如下:

enter image description here

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

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

1 回答

  • 2

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

    我将假设所有流共享一个可用于加入相应项的公共密钥 .

    最简单的方法可能是在其open()方法(docs about rich functions)中使用 RichFlatmap 并加载静态浓缩数据 . 这仅适用于富集数据是静态的,或者如果您愿意在需要更新浓缩数据时重新启动浓缩作业 .

    对于下面描述的其他方法,您应该将富集数据存储为托管,键控状态(请参阅docs about working with state in Flink) . 这将使Flink能够在发生故障时恢复和恢复您的浓缩工作 .

    假设您想要实际流式传输浓缩数据,那么 RichCoFlatmap 更合适 . 这是一个有状态运算符,可用于合并或连接两个连接的流 . 但是,使用 RichCoFlatmap 时,您无法将流元素的计时考虑在内 . 例如,如果关注一个流在第二个流之前或之后,并希望以可重复的,确定性的方式执行丰富,那么使用CoProcessFunction是正确的方法 .

    您将在Apache Flink training materials中找到详细示例和代码 .

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

    更新:

    Flink的Table和SQL API也可以用于流丰富,Flink 1.4通过添加流时窗口内连接来扩展此支持 . 见Table API joinsSQL 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个订单内,则此示例将订单与其相应的货件连接 .

相关问题