《Apache Flink 案例集(2022版)》——2.数据分析——快手-Flink SQL 在快手的扩展和实践(2)

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 《Apache Flink 案例集(2022版)》——2.数据分析——快手-Flink SQL 在快手的扩展和实践(2)

《Apache Flink 案例集(2022版)》——2.数据分析——快手-Flink SQL 在快手的扩展和实践(1) https://developer.aliyun.com/article/1228373



生产实践


一、功能扩展


为了支持内部的业务需求,快手做了很多功能扩展,其中两个围绕窗口的扩展尤为重要:一个是 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 子句。括号里有两个元素:一个表示总维度,一个表示主题维度。


image.png


数据分析的开发者经常会遇到这样的需求,绘制一条曲线,每个点的含义是当天 0 点到当前时间点的累计指标,横坐标表示时间,纵坐标是表示累计的指标。对这样的需求可以有两个解决方案:  


第一个方案是使用无限流聚合,把时间归一到分钟粒度以后作为 group key 的一列,但是业务上要求输出到屏幕上的曲线不再变化,而无限流聚合的输出结果是一个更新流,所以不符合要求;


第二个方案是使用一天的滚动窗口函数。为了提前输出结果,还是要设置提前触发,时间点选用当前机器的时间或者是历史输入数据里最大的时间戳。这个方案的缺点,首先是每个点的纵坐标的值并不是这个时间点上的累计值。这会导致几个异常现象,比如作业失败重启或者是业务主动回溯历史的时候,不能完全还原当时的历史曲线。而且各个点上分维度的累计值加起来也不等于总维度的值。还有一个缺点,统计 UV 的时候,我们经常会使用两阶段的聚合来避免 distinct key 的倾斜,但是使用这个方案的时候,原本自身的曲线上可能会出现凹坑。  


我们引入 CUMULATE 窗口来解决这些问题,主要有两方面的优点:  


第一是使用窗口的结束时间作为每个点的横坐标,曲线上每个点的纵坐标就是在横坐标对应时间点上的累计值,所以无论在回溯历史或者是作业发生 failover 的情况下,曲线都可以完全还原,而且各个时间点上分维度的值加起来总是等于总维度的值;


第二是使用两阶段聚合,能够防止 distinct key 倾斜。由于数据是在窗口结束的时候才发送,所以不存在撤回,输出的是 append 流,因此自增曲线上也不会有凹坑。


2. Window Table-valued Function 扩展

image.png


社区在 FLIP-145 中提出 Window Table-valued Function (Window TVF) 语法,并且实现了窗口聚合。在这个基础上我们丰富了窗口算子,包括 TopN、关联和去重,还支持了一个单独的 Window TVF 查询语句,这些功能都已经陆续推到社区的各个版本里。有了这些窗口的算子,用户就可以用 Flink SQL 实现更复杂的业务逻辑。  


image.png


如上图案例,需要统计当天最热销的 100 件商品的销售额和买家数,以及这些爆品所属主播的销售情况。首先做一个窗口聚合,得到 0 点以来每个商品的销售额和买家数,再做一个窗口聚合,得到每个主播所有宝贝的买家数,两个结果做窗口关联,最后做窗口上的 TopN,得到前 100 名爆品以及它的各项累计指标。  


此外快手在Window TVF上还增加了对批模式的支持。原理是引入一个 windows 算子,给输入数据附上所属的窗口属性后发给下游,而下游的算子复用批上已经存在的算子,比如说聚合上是用 HashAgg 或者 SortAgg,关联上是 HashJoin 或者 SortMergeJoin,这些批上的算子和流模式下的算子相比,不需要状态,所以吞吐上也有更好的表现。

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
1月前
|
消息中间件 存储 监控
构建高可用性Apache Kafka集群:从理论到实践
【10月更文挑战第24天】随着大数据时代的到来,数据传输与处理的需求日益增长。Apache Kafka作为一个高性能的消息队列服务,因其出色的吞吐量、可扩展性和容错能力而受到广泛欢迎。然而,在构建大规模生产环境下的Kafka集群时,保证其高可用性是至关重要的。本文将从个人实践经验出发,详细介绍如何构建一个高可用性的Kafka集群,包括集群规划、节点配置以及故障恢复机制等方面。
67 4
|
3月前
|
SQL 存储 API
Flink实践:通过Flink SQL进行SFTP文件的读写操作
虽然 Apache Flink 与 SFTP 之间的直接交互存在一定的限制,但通过一些创造性的方法和技术,我们仍然可以有效地实现对 SFTP 文件的读写操作。这既展现了 Flink 在处理复杂数据场景中的强大能力,也体现了软件工程中常见的问题解决思路——即通过现有工具和一定的间接方法来克服技术障碍。通过这种方式,Flink SQL 成为了处理各种数据源,包括 SFTP 文件,在内的强大工具。
178 15
|
1月前
|
存储 数据挖掘 数据处理
巴别时代使用 Apache Paimon 构建 Streaming Lakehouse 的实践
随着数据湖技术的发展,企业纷纷探索其优化潜力。本文分享了巴别时代使用 Apache Paimon 构建 Streaming Lakehouse 的实践。Paimon 支持流式和批处理,提供高性能、统一的数据访问和流批一体的优势。通过示例代码和实践经验,展示了如何高效处理实时数据,解决了数据一致性和故障恢复等挑战。
110 61
|
2月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
79 11
|
2月前
|
SQL 存储 关系型数据库
添加数据到数据库的SQL语句详解与实践技巧
在数据库管理中,添加数据是一个基本操作,它涉及到向表中插入新的记录
|
2月前
|
SQL 关系型数据库 数据库
SQL数据库:核心原理与应用实践
随着信息技术的飞速发展,数据库管理系统已成为各类组织和企业中不可或缺的核心组件。在众多数据库管理系统中,SQL(结构化查询语言)数据库以其强大的数据管理能力和灵活性,广泛应用于各类业务场景。本文将深入探讨SQL数据库的基本原理、核心特性以及实际应用。一、SQL数据库概述SQL数据库是一种关系型数据库
74 5
|
2月前
|
SQL 开发框架 .NET
ASP连接SQL数据库:从基础到实践
随着互联网技术的快速发展,数据库与应用程序之间的连接成为了软件开发中的一项关键技术。ASP(ActiveServerPages)是一种在服务器端执行的脚本环境,它能够生成动态的网页内容。而SQL数据库则是一种关系型数据库管理系统,广泛应用于各类网站和应用程序的数据存储和管理。本文将详细介绍如何使用A
62 3
|
3月前
|
SQL 消息中间件 Java
兼容Trino Connector,扩展Apache Doris数据源接入能力|Lakehouse 使用手册(四)
通过兼容 Connector 插件,Apache Doris 能够支持 Trino/Presto 可对接的所有数据源,而无需改动 Doris 的内核代码。
兼容Trino Connector,扩展Apache Doris数据源接入能力|Lakehouse 使用手册(四)
|
2月前
|
存储 小程序 Apache
10月26日@杭州,飞轮科技 x 阿里云举办 Apache Doris Meetup,探索保险、游戏、制造及电信领域数据仓库建设实践
10月26日,由飞轮科技与阿里云联手发起的 Apache Doris 杭州站 Meetup 即将开启!
56 0
|
2月前
|
SQL 消息中间件 分布式计算
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(一)
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(一)
85 0

相关产品

  • 实时计算 Flink版
  • 推荐镜像

    更多