Flink SQL 如何实现数据流的 Join?

  • 时间:
  • 浏览:1
  • 来源:大发彩神下载—大发彩神APP

那么有那么肯能设置有另另一个 缓存剔除策略,将并并不的历史数据及时清理呢?答案是肯定的,关键在于缓存剔除策略怎么才能 才能 实现,这也是 Flink SQL 提供的并不是 Join 的主要区别。

图3. Join-in-continuous-query-3

图7. Temporal Table Registration]

图2. Join-in-continuous-query-2

图1. Join-in-continuous-query-1

以更常用的 Event Time Windowed Join 为例,有另另一个 将 Orders 订单表和 Shipments 运输单表辦法 订单时间和运输时间 Join 的查询如下:

图4. Time-Windowed Join 的时间下界 - Orders 表

这个查询会为 Orders 表设置了 o.ordertime > s.shiptime- INTERVAL ‘4’ HOUR 的时间下界(图4)。

不过我其实底层实现上那么问提,但怎么才能 才能 通过 SQL 语法定义时间仍是难点。尽管在实时计算领域 Event Time、Processing Time、Watermark 哪几种概念肯能成为业界共识,但在 SQL 领域对时间数据类型的支持仍比较弱[4]。却说我,定义 Watermark 和时间语义都须要通过编程 API 的辦法 完成,比如从 DataStream 转换至 Table ,无需 单纯靠 SQL 完成。这方面的支持 Flink 社区计划通过拓展 SQL 方言来完成,感兴趣的读者完会 通过 FLIP-66[7] 来追踪进度。

无论在 OLAP 还是 OLTP 领域,Join 须要业务常会涉及到且优化规则比较错综复杂的 SQL 句子。对于离线计算而言,经过数据库领域多年的积累,Join 语义以及实现肯能十分心智心智成熟期是什么图片 ,然而对于近年来刚兴起的 Streaming SQL 来说 Join 却占据 刚起步的清况 。

Temporal Table Join 相似于 Hash Join,将输入分为 Build Table 和 Probe Table。前者一般是纬度表的 changelog,后者一般是业务数据流,典型清况 下后者的数据量应该远大于前者。在 Temporal Table Join 中,Build Table 是有另另一个 基于 append-only 数据流的带时间版本的视图,越多越多越多越多又称为 Temporal Table。Temporal Table 要求定义有另另一个 主键和用于版本化的字段(通常却说我 Event Time 时间字段),以反映记录在不一齐间的内容。

另外,尽管在实时计算领域 Join 完会 灵活地用底层编程 API 来实现,但在 Streaming SQL 中 Join 的发展仍占据 比较初级的阶段,其中关键点在于怎么才能 才能 将时间属性要花费 地融入 SQL 中,这点 ISO SQL 委员会制定的 SQL 标准并那么给出完整版的答案。肯能从另外有另另一个 层厚来讲,作为 Streaming SQL 最早的开拓者之一,Flink 社区很适合探索出一套合理的 SQL 语法反过来贡献给 ISO。

在 Rates 的帮助下,亲们完会 将业务逻辑用以下的查询来表达:

我其实 Timed-Windowed Join 出理 了资源问提,但也限制了使用场景: Join 有另另一个 输入流都须要有时间下界,超过却说则不可访问。这对于越多越多越多越多 Join 维表的业务来说是不适用的,肯能越多越多越多越多清况 下维表并那么时间界限。针对这个问提,Flink 提供了 Temporal Table Join 来满足用户需求。

其中最为关键的问提在于 Join 的实现依赖于缓存整个数据集,而 Streaming SQL Join 的对象却是无限的数据流,内存压力和计算速率单位在长期运行来说须要不可出理 的问提。下文将结合 SQL 的发展解析 Flink SQL 是怎么才能 才能 出理 哪几种问提并实现有另另一个 数据流的 Join。

相对于离线的 Join,实时 Streaming SQL(面向无界数据集的 SQL)无法缓存所有数据,却说我 Sort-Merge Join 要求的对数据集进行排序基本是无法做到的,而 Nested-loop Join 和 Hash Join 经过一定的改良则完会 满足实时 SQL 的要求。

亲们通过例子来看基本的 Nested Join 在实时 Streaming SQL 的基础实现(案例及图来自 Piotr Nowojski 在 Flink Forward San Francisco 的分享[2])。

实时领域 Streaming SQL 中的 Join 与离线 Batch SQL 中的 Join 最大不同点在于无法缓存完整版数据集,却说我要给缓存设定基于时间的清理条件以限制 Join 涉及的数据范围。根据清理策略的不同,Flink SQL 分别提供了 Regular Join、Time-Windowed Join 和 Temporal Table Join 来应对不同业务场景。

接着 Table B 依次接受到有另另一个 新的元素,分别是 7、3、1。肯能 1 匹配到 Table A 的元素,却说我结果表再输出有另另一个 元素 1。

原文链接

传统的离线 Batch SQL (面向有界数据集的 SQL)有并不是基础的实现辦法 ,分别是 Nested-loop Join、Sort-Merge Join 和 Hash Join。

却说我有另另一个 输入表都只须要缓占据 时间下界以上的数据,将空间占用维持在合理的范围。

图8. Temporal Table Content]

Table A 有 1、42 有另另一个 元素,Table B 有 42 有另另一个 元素,越多越多越多越多此时的 Join 结果会输出 42。

并为 Shipmenets 表设置了 s.shiptime >= o.ordertime 的时间下界(图5)。

肯能历史数据无需被清理,越多越多越多越多 Regular Join 允许对输入表进行任意种类的更新操作(insert、update、delete)。然而肯能资源问提 Regular Join 通常是不可持续的,一般只用做有界数据流的 Join。

却说 Table A 经常出现新的输入 2、3、6,3 匹配到 Table B 的元素,却说我再输出 3 到结果表。

Regular Join 是最为基础的那么缓存剔除策略的 Join。Regular Join 中有另另一个 表的输入和更新完会对全局可见,影响却说所有的 Join 结果。举例,在有另另一个 如下的 Join 查询里,Orders 表的新纪录会和 Product 表所有历史纪录以及未来的纪录进行匹配。

Time-Windowed Join 利用窗口给有另另一个 输入表设定有另另一个 Join 的时间界限,超出时间范围的数据则对 JOIN 不可见并完会 被清理掉。值得注意的是,这里涉及到的有另另一个 问提是时间的语义,时间完会 指计算占据 的系统时间(即 Processing Time),也完会 指从数据并不是的时间字段提取的 Event Time。肯能是 Processing Time,Flink 根据系统时间自动划分 Join 的时间窗口并定时清理数据;肯能是 Event Time,Flink 分配 Event Time 窗口并辦法 Watermark 来清理数据。

亲们将 RatesHistory 注册为有另另一个 名为 Rates 的 Temporal Table,设定主键为 currency,版本字段为 time。

作者介绍:

林小铂,网易游戏高级开发工程师,负责游戏数据中心实时平台的开发及运维工作,目前专注于 Apache Flink 的开发及应用。探究问提曾经却说我并不是乐趣。

比如典型的有另另一个 例子是对商业订单金额进行汇率转换。假设有有另另一个 Orders 流记录订单金额,须要和 RatesHistory 汇率流进行 Join。RatesHistory 代表不同货币转为日元的汇率,每当汇率有变化时就会有四根更新记录。有另另一个 表在某一时间节点内容如下:

值得注意的是,不同于在 Regular Join 和 Time-Windowed Join 中有另另一个 表是平等的,任意有另另一个 表的新记录都完会 与另一表的历史记录进行匹配,在 Temporal Table Join 中,Temoparal Table 的更新对另一表在该时间节点却说的记录是不可见的。这由于亲们只须要保存 Build Side 的记录直到 Watermark 超过记录的版本字段。肯能 Probe Side 的输入理论上无需再有早于 Watermark 的记录,哪几种版本的数据完会 安全地被清理掉。

此后给 Rates 指定时间版本,Rates 则会基于 RatesHistory 来计算符合时间版本的汇率转换内容。

完会 看后在 Nested-Loop Join 中亲们须要保存有另另一个 输入表的内容,而随着时间的增长 Table A 和 Table B 须要保存的历史数据无止境地增长,由于很不合理的内存磁盘资源占用,却说我单个元素的匹配速率单位也会那么低。相似的问提也占据 于 Hash Join 中。

图6. Temporal Table Join Example]

图5. Time-Windowed Join 的时间下界 - Shipment 表