一 前言
传统的大数据技术起源于 Google 三架马车 GFS、MapReduce、Bigtable,以及其衍生的开源分布式文件系统 HDFS,分布式计算引擎 MapReduce,以及分布式数据库 HBase。最初的大数据技术与需求往往集中在超大规模数据存储、数据处理、在线查询等。在这个阶段,很多公司会选择自建机房部署 Hadoop 的方式,大数据技术与需求集中在离线计算与大规模存储上,常见的体现方式有 T+1 报表,大规模数据在线查询等。
随着互联网技术的日渐发展、数据规模的扩大与复杂的需求场景的产生,传统的大数据架构无法承载。大数据架构在近些年的演进主要体现下以下几方面:
- 规模化:这里的规模化主要体现在大数据技术的使用规模上和数据规模的增长。大数据技术的使用规模增长代表越来越多的复杂需求产生,而数据规模的增长决定了传统的准大数据技术(如 MySQL)无法解决所有问题。因此,拿存储组件举例来说,通常会划分到不同的数据分层,面向规模、成本、查询和分析性能等不同维度的优化偏向,以满足多样性的需求。
- 实时化:传统的 T+1 的离线大数据技术无法满足推荐、监控类近实时的需求,整个大数据生态和技术架构在过去十年发生了很大的升级换代。就存储上来说,传统的 HDFS 文件存储、Hive 数仓无法满足低成本,可更新迭代的需求,因此滋生出 Hudi 等数据方案。就计算上来说,传统的 MapReduce 批处理的能力无法做到秒级的数据处理,先后出现 Storm 较原始的实时处理和 Spark Streaming 的微批处理,目前由 Flink 基于 Dataflow 模型的实时计算框架在实时计算领域占据绝对主导地位。
- 云原生化:传统的公司往往会选择自建机房,或者在云上购买机器部署实例这种云托管的形式,但这种架构存在低谷期利用率低,存储计算不分离导致的存储和计算弹性差,以及升级灵活度低等各种问题。云原生大数据架构就是所谓的数据湖,其本质就是充分利用云上的弹性资源来实现一个统一管理、统一存储、弹性计算的大数据架构,变革了传统大数据架构基于物理集群和本地磁盘的计算存储架构。其主要技术特征是存储和计算分离和 Serverless。在云原生大数据架构中,每一层架构都在往服务化的趋势演进,存储服务化、计算服务化、元数据管理服务化等。每个组件都被要求拆分成不同的单元,具备独立扩展的能力,更开放、更灵活、更弹性。
本篇文章将基于云原生大数据架构的场景,详细讨论实时计算中的维表和结果表的架构选型。
二 大数据架构中的实时计算
1 实时计算场景
大数据的高速发展已经超过 10 年,大数据也正在从计算规模化向更加实时化的趋势演进。实时计算场景主要有以下几种最常见的场景:
- 实时数仓:实时数仓主要应用在网站 PV / UV 统计、交易数据统计、商品销量统计等各类交易型数据场景中。在这种场景下,实时计算任务通过订阅业务实时数据源,将信息实时秒级分析,最终呈现在业务大屏中给决策者使用,方便判断企业运营状况和活动促销的情况。
- 实时推荐:实时推荐主要是基于 AI 技术,根据用户喜好进行个性化推荐。常见于短视频场景、内容资讯场景、电商购物等场景。在这种场景下,通过用户的历史点击情况实时判断用户喜好,从而进行针对性推荐,以达到增加用户粘性的效果。
- 数据 ETL:实时的 ETL 场景常见于数据同步任务中。比如数据库中不同表的同步、转化,或者是不同数据库的同步,或者是进行数据聚合预处理等操作,最终将结果写入数据仓库或者数据湖进行归档沉淀。这种场景主要是为后续的业务深度分析进行前期准备工作。
- 实时诊断:这种常见于金融类或者是交易类业务场景。在这些场景中,针对行业的独特性,需要有反作弊监管,根据实时短时间之内的行为,判定用户是否为作弊用户,做到及时止损。该场景对时效性要求极高,通过实时计算任务对异常数据检测,实时发现异常并进行及时止损。
2 Flink SQL 实时计算
实时计算需要后台有一套极其强大的大数据计算能力,Apache Flink 作为一款开源大数据实时计算技术应运而生。由于传统的 Hadoop、Spark 等计算引擎,本质上是批计算引擎,通过对有限的数据集进行数据处理,其处理时效性是不能保证的。而 Apache Flink ,从设计之初就以定位为流式计算引擎,它可以实时订阅实时产生的流式数据,对数据进行实时分析处理并产生结果,让数据在第一时间发挥价值。
Flink 选择了 SQL 这种声明式语言作为顶层 API,方便用户使用,也符合云原生大数据架构的趋势:
- 大数据普惠,规模生产:Flink SQL 能够根据查询语句自动优化,生成最优的物理执行计划,屏蔽大数据计算中的复杂性,大幅降低用户使用门槛,以达到大数据普惠的效果。
- 流批一体:Flink SQL 具备流批统一的特性,无论是流任务还是批处理任务都给用户提供相同的语义和统一的开发体验,方便业务离线任务转实时。
- 屏蔽底层存储差异:Flink 通过提供 SQL 统一查询语言,屏蔽底层数据存储的差异,方便业务在多样性的大数据存储中进行灵活切换,对云上大数据架构进行更开放、灵活的调整。
上图是 Flink SQL 的一些基本操作。可以看到 SQL 的语法和标准 SQL 非常类似,示例中包括了基本的 SELECT、FILTER 操作,可以使用内置函数(如日期的格式化),也可以在注册函数后使用自定义函数。
Flink SQL 将实时计算拆分成源表,结果表和维表三种,将这三种表的 DDL 语句(比如 CREATE TABLE)注册各类输入、输出的数据源,通过 SQL 的 DML(比如 INSERT INTO)表示实时计算任务的拓扑关系,以达到通过 SQL 完成实时计算任务开发的效果。
- 源表:主要代表消息系统类的输入,比如 Kafka,MQ(Message Queue),或者 CDC(Change Data Capture,例如将 MySQL binlog 转换成实时流)输入。
- 结果表:主要代表 F