一、功能扩展 为了支持内部的业务需求,快手做了很多功能扩展,其中两个围绕窗口的扩展尤为重要:一个是 Group Window Aggregate 扩展,一个是在 Flip-145 里提出的 Window Table-valued Function 扩展。
Group Window Aggregate 扩展。 快手在 Group Window Aggregate 上做了两个扩展,一个是支持多维聚合,一个是引入高阶窗口函数。Flink SQL 很早就支持无限流上的多维聚合,快手在 Group Window Aggregate 上也增加了多维分析的功能, 支持标准的 Grouping Sets、Rollup 和 CUBE 子句,另外还支持各种窗口类型,比如滚动、滑动、会话窗口等。 比如上图实例,需要统计主题维度和总维度下的累计 UV,SQL 的 group by 子句里包含两部分:一个是 CUMULATE 窗口函数,一个是 Grouping Sets 子句。括号里有两个元素:一个表示总维度,一个表示主题维 度。
Window Table-valued Function 扩展。社区在 FLIP-145 中提出 Window Table-valued Function (Window TVF) 语法,并且实现了窗口聚合。在这个 基础上我们丰富了窗口算子,包括 TopN、关联和去重,还支持了一个单独的 Window TVF 查询语句,这些功 能都已经陆续推到社区的各个版本里。有了这些窗口的算子,用户就可以用 Flink SQL 实现更复杂的业务逻辑。
二、 性能优化 • 聚合上的状态优化。最原始的查询语句如上图,group key 是一个频道,用一个 count distinct 来计算各个频道的 UV。设备集合在 状态中首先是存在一个 map state,假设频道的枚举只有三个,A、B 和 other,group key 是频道 ID, map state 的 key 设备 ID, value 是一个 64 bit 的 long 类型的值,每个 bit 表示这个频道下该设备是否出现,在简 单的场景下这个 Value 值就是 1。上图 B 频道下有两个设备,ID 分别是 1 和 3,ID 为 1 的设备同时访问了 A 频道,id 为 3 的设备同时访问了 other 频道。可以发现,不同频道的 map 可以有大量的重合。我们提出一种简化的 SQL 表达方式,既能达到状态上的收益,又能减轻数据开发人员的负担。用户只需要在 查询语句里,通过一个方式告诉优化器 group key 的枚举值,优化器就会自动改写,进行转列和列转行,改 写后就可以复用 distinct map state。改写后等价下的查询语句,只需要在过滤条件里指定枚举值就可以,用 in 或 or 的表达方式都可以。• 维表关联的攒批优化。维表关联的攒批优化是为了减少 RPC 的调用次数。原理是攒一批数据以后,调用维表的批量查询接口,语法 上快手引入通用的 Mini-Batch hint,它有两个参数:一个表示多长时间攒一批,一个表示多少条数据攒一批。 一个合法的 Mini-Batch hint 需要至少包含一个参数。快手将 hint 设计得很通用,希望它不仅可以用于维表关 联,还可以用于聚合的攒批优化。
以上内容摘自《Apache Flink 案例集(2022版)》电子书,点击https://developer.aliyun.com/ebook/download/7718 可下载完整版
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。