提到实时计算或者流计算,我们很自然地会想到Flink。如今,Flink已成为实时计算的事实标准,很多大型互联网企业的实时推荐、实时ETL、实时数仓、实时风控等场景,也都是基于Apache Flink加各种开源的OLAP引擎构建。那么,Flink到底是如何以Pipeline(管道)的模式,完成实时业务场景支撑的呢?本文将对Apache Flink几个子项目进行汇总!
1、 Flink CDC 数据集成
Flink CDC是Apache Flink的一个重要组件,是一款非常优秀的流处理引擎。广义概念上,只要是能够捕获数据变更的技术,都可以成为是CDC。目前通常描述的CDC技术主要面向数据库的变更,是一种用于捕获数据库中数据变更的技术。CDC的应用非常广泛,支持从 MySQL、MariaDB、RDS MySQL等数据库中实时地读取存量历史数据和增量变更数据,整个过程提供 exactly-once 语义保证。
作为新一代数据集成框架,Flink CDC可以看做是数据从源头连接到数据仓库的管道,可屏蔽一切复杂问题,让用户专注于数据分析,包括数据迁移、数据分发、数据采集等。Flink CDC 同时提供了 SQL API 和 DataStream API 两套 API,很好地满足了不同开发者的需求。
Flink CDC 既可以替代传统的 DataX 和 Canal 工具做实时数据同步,将数据库的全量和增量数据一体化地同步到消息队列和数据仓库中;也可以做实时数据集成,将数据库数据实时入湖入仓;同时还支持强大的数据加工能力,可以通过 SQL 对数据库数据做实时关联、打宽、聚合,并将物化结果写入到各种存储中。相对于其他数据集成框架,Flink CDC 具有全增量一体化、无锁读取、并发读取、分布式架构等技术优势,因此在开源社区中非常受欢迎。
2、Flink SQL数据分析
Flink能快速发展,和Flink SQL的诞生息息相关。最早,Flink虽然有着自身技术的先进性,但很多企业无法使用,学习成本高。有了Flink SQL以后,用户可以基于熟悉的SQL语义使用Flink。
准确来讲,Flink SQL是Flink 实时计算为简化计算模型、降低用户使用实时计算门槛而设计的一套符合标准 SQL 语义的开发语言。 自 2015 年开始,阿里巴巴开始调研开源流计算引擎,最终决定基于 Flink 打造新一代计算引擎,针对 Flink 存在的不足进行优化和改进,并且在 2019 年初将最终代码开源,也就是很多人熟悉的Blink。Blink在原来的 Flink 基础上最重要的一个贡献就是实现了Flink SQL 。
在传统的流式计算领域,比如 Storm、Spark Streaming 都会提供一些 Function 或者 Datastream API,用户通过 Java 或 Scala 写业务逻辑,这种方式虽然灵活,但有一些不足,比如具备一定门槛且调优较难,随着版本的不断更新,API 也出现了很多不兼容的地方。此种背景下,Flink SQL成为优选,不同行业和领域的人都熟悉,学习成本较低,用户只要表达清楚需求即可,不需要了解具体做法。
3、 Flink ML机器学习
Apache Flink的机器学习库称为Flink ML。由于过去五年来机器学习的使用呈指数增长,因此Flink社区决定将这种机器学习APO也添加到其生态系统中。在FlinkML中,贡献者和算法的列表正在增加。
具体而言,开发团队重构了Flink ML早期的函数库,扩展Flink ML API并更新Runtime主要功能,比如:开始支持多输入和多输出,和添加流媒体批次统一函数库等。另外,Flink ML添加了5个算法实例,包括对数几率回归、k-means、K-近邻算法、单纯贝氏分类器以及One-hot编码器,除了加入新的算法外,官方也会持续进行压力测试和优化,确保算法的性能。
传统的Estimator/Transformer范式,并不提供API以流媒体的方式暴露模型资料,因此用户就许要反复调用fit来更新模型资料,官方表示,用户虽然可以每隔数分钟更新一次模型资料,但是这种方法效率非常差。而新版本中提供了getModelData API,供用户将资料模型即时传输到网页服务器,并使用最新的模型资料进行线上推理,这项功能可以明显强化Flink ML的线上学习应用能力。目前,Flink ML已成为Apache Flink流媒体处理框架的一部分,提供机器学习API和基础设施函数库,能够简化机器学习工作管线构建工作。
4、 Flink CEP规则引擎
CEP 是复杂事件处理(Complex Event Process,简称CEP)的缩写,主要用来检测无尽数据流中的复杂模式,拥有从不同的数据行中辨识查找模式的能力。模式匹配是复杂事件处理的一个强大援助。
CEP 本身并没有脱离实时计算的范畴,所以绝大部分用户还是选择基于 Flink,或者已有的计算服务上去搭建相关的框架,CEP 对应的功能更多是以 library 的形式存在。对于大多数 CEP 的应用场景而言,“复杂规则”的制定者通常是运营、商家、市场等非技术同学,对于大多数 CEP 的业务效果而言,通常是短时间内直接触达用户。
Flink CEP是基于Flink Runtime构建的实时数据规则引擎,擅长解决跨事件的匹配问题。如:结合了时序的上下文风控场景,识别了作弊的行为序列后,给「先做 xx,后做 xx,再做 xx」的用户进行封禁;结合了否定语义的电商营销场景,给「浏览商品后 10 分钟未下单的用户」发送优惠券。
5、 Flink Table Store动态表存储
作为Apache Flink 的一个子项目,Flink Table Store 是Flink在推动流批一体演进中存储领域上的重要一环。
Flink 在 Table API 和 SQL 中提出了动态表的概念,跟 Hive 表在离线数仓中间层的作用类似,动态表是实时数据仓库的中间层。动态表中数据是随时间变化的,而静态表只能包含离线处理的数据。我们可以将实时计算看成对动态表上变更数据的处理,将离线计算看成对动态表某个时间快照的处理。用户可以像查询批处理表一样查询动态表,对动态表的查询将生成一个不会停止的连续查询,并且不断更新下游的结果表,以反映输入动态表上的更改,这构成了实时数仓的基本链路。本质上,动态表上的连续查询非常类似于定义物化视图的查询。
整体来说, Flink Table Store是解决存算分离、存储统一的重要组件。Flink Table Store是一个流批统一的存储,能提供一定的 OLAP 查询能力(基于列式存储),可做到毫秒级别的实时流式读取,能够支持 Insert Overwrite。同时,Flink Table Store也是最为完善的 Flink Connector,支持 Flink SQL 的全部概念,支持任意 Flink Job 的输出,支持所有数据类型。更重要的是,还能够结合 Flink SQL 提供 DB 级别的体验,并且支持大规模更新。
2022年,Apache Flink已经更新到1.16版,有了诸多更新,包括:分布式一致性快照架构升级、创新流批自适应融合 Shuffle、基于异步与缓存技术的流式 SQL维表Join 改进、完整兼容 Hive 生态、PyFlink 功能及性能全面生产可用等。针对社区基于 DataStream API 重新建设的Flink ML,目前已经发布了两个版本。另外,在Streaming Data Warehouse 流式数仓方面的探索,也是值得重点关注的方向。