开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

FlinkSQL 在快手的扩展和实践是什么?

已解决

FlinkSQL 在快手的扩展和实践是什么?

展开
收起
游客lmkkns5ck6auu 2022-08-31 10:37:32 240 0
1 条回答
写回答
取消 提交回答
  • 推荐回答

    一、功能扩展 为了支持内部的业务需求,快手做了很多功能扩展,其中两个围绕窗口的扩展尤为重要:一个是 Group Window Aggregate 扩展,一个是在 Flip-145 里提出的 Window Table-valued Function 扩展。

    1. Group Window Aggregate 扩展。 快手在 Group Window Aggregate 上做了两个扩展,一个是支持多维聚合,一个是引入高阶窗口函数。Flink SQL 很早就支持无限流上的多维聚合,快手在 Group Window Aggregate 上也增加了多维分析的功能, 支持标准的 Grouping Sets、Rollup 和 CUBE 子句,另外还支持各种窗口类型,比如滚动、滑动、会话窗口等。 比如上图实例,需要统计主题维度和总维度下的累计 UV,SQL 的 group by 子句里包含两部分:一个是 CUMULATE 窗口函数,一个是 Grouping Sets 子句。括号里有两个元素:一个表示总维度,一个表示主题维 度。

    2. 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 可下载完整版

    2022-08-31 12:19:19
    赞同 展开评论 打赏

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

相关电子书

更多
苑海胜专访 《MaxCompute 与大数据查询引擎的技术和故事》 立即下载
实时数仓Hologres技术实战一本通2.0版(下) 立即下载
实时数仓Hologres技术实战一本通2.0版(上) 立即下载