flink写⼊mysql_当TiDB与Flink相结合:⾼效、易⽤的实时数
随着互联⽹飞速发展,企业业务种类会越来越多,业务数据量会越来越⼤,当发展到⼀定规模时,传统的数据存储结构逐渐⽆法满⾜企业需求,实时数据仓库就变成了⼀个必要的基础服务。以维表 Join 为例,数据在业务数据源中以范式表的形式存储,在分析时需要做⼤量的Join 操作,降低性能。如果在数据清洗导⼊过程中就能流式的完成 Join,那么分析时就⽆需再次 Join,从⽽提升查询性能。
利⽤实时数仓,企业可以实现实时 OLAP 分析、实时数据看板、实时业务监控、实时数据接⼝服务等⽤途。但想到实时数仓,很多⼈的第⼀印象就是架构复杂,难以操作与维护。⽽得益于新版 Flink 对 SQL 的⽀持,以及 TiDB HTAP 的特性,我们探索了⼀个⾼效、易⽤的Flink+TiDB 实时数仓解决⽅案。
本⽂将⾸先介绍实时数仓的概念,然后介绍 Flink+TiDB 实时数仓的架构与优势,接着给出⼀些已经在使⽤中的⽤户场景,最后给出在docker-compose 环境下的 Demo,⽤于读者进⾏尝试。
实时数仓的概念
数据仓库的概念在 90 年代由 Bill Inmon 提出,是指⼀个⾯向主题的、集成的、相对稳定的、反映历史变化的集合,⽤于⽀持管理决策。当时的数据仓库通过消息队列收集来⾃数据源的数据,通过每天或每
周进⾏⼀次计算以供报表使⽤,也称为离线数仓。
离线数仓架构
进⼊ 21 世纪,随着计算技术的发展、以及整体算⼒的提升,决策的主体逐渐从⼈⼯控制转变为计算机算法,出现了实时推荐、实时监控分析等需求,对应的决策周期时间由天级逐步变为秒级,在这些场景下,实时数仓应运⽽⽣。
当前的实时数仓主要有三种架构:Lambda架构、Kappa 架构以及实时 OLAP 变体架构:
Lambda 架构是指在离线数仓的基础上叠加了实时数仓部分,使⽤流式引擎处理实时性较⾼的数据,最后将离线和在线的结果统⼀供应⽤使⽤。
实时数仓的 Lambda 架构
Kappa 架构则移除了离线数仓部分,全部使⽤实时数据⽣产。这种架构统⼀了计算引擎,降低了开发成本。
实时数仓的 Kappa 架构
随着实时 OLAP 技术的提升,⼀个新的实时架构被提出,暂时被称为“实时 OLAP 变体”。简单来说,就是将⼀部分计算压⼒从流式中心的英文center的形容词
计算引擎转嫁到实时 OLAP 分析引擎上,以此进⾏更加灵活的实时数仓计算。
浮点运算在哪里使用
总结⼀下,对于实时数仓,Lambda 架构需要维护流批两套引擎,开发成本相较其它两者更⾼。相⽐于 Kappa 架构,实时 OLAP 变体架构可以执⾏更加灵活的计算,但需要依赖额外的实时 OLAP 算⼒资源。接下来我们将介绍的 Flink + TiDB 实时数仓⽅案,就属于实时OLAP 变体架构。
关于实时数仓及这些架构更加详细的对⽐说明,有兴趣的读者可以参考 Flink 中⽂社区的这篇⽂章:基于 Flink 的典型 ETL 场景实现⽅案。
Flink+ TiDB 实时数仓
Flink 是⼀个低延迟、⾼吞吐、流批统⼀的⼤数据计算引擎,被普遍⽤于⾼实时性场景下的实时计算,具有⽀持 exactly-once 等重要特性。
在集成了 TiFlash 之后,TiDB 已经成为了真正的 HTAP(在线事务处理 OLTP + 在线分析处理 OLAP)数据库。换句话说,在实时数仓架构中,TiDB 既可以作为数据源的业务数据库,进⾏业务查询的处理;⼜可以作为实时 OLAP 引擎,进⾏分析型场景的计算。
结合了 Flink 与 TiDB 两者的特性,Flink+ TiDB 的⽅案的优势也体现了出来:⾸先是速度有保障,两者都可以通过⽔平扩展节点来增加算⼒;其次,学习和配置成本相对较低,因为 TiDB 兼容 MySQL 5.7 协议,⽽最新版本的 Flink 也可以完全通过 Flink SQL 和强⼤的连接器(connector)来编写提交任务,节省了⽤户的学习成本。
对于 Flink + TiDB 实时数仓,下⾯是⼏种常⽤的搭建原型,可以⽤来满⾜不同的需求,也可以在实际使⽤中⾃⾏扩展。
以 MySQL 作为数据源
通过使⽤ Ververica 官⽅提供的 flink-connector-mysql-cdc[1],Flink 可以既作为采集层采集 MySQL
的 binlog ⽣成动态表,也作为流计算层实现流式计算,如流式 Join、预聚合等。最后,Flink 通过 JDBC 连接器将计算完成的数据写⼊ TiDB 中。
以 MySQL 作为数据源的简便架构
这个架构的优点是⾮常简洁⽅便,在 MySQL 和 TiDB 都准备好对应数据库和表的情况下,可以通过只编写 Flink SQL 来完成任务的注册与提交。读者可以在本⽂末尾的【在docker-compose 中进⾏尝试】⼀节中尝试此架构。
以 Kafka 对接 Flink
如果数据已经从其它途径存放到了Kafka 中,可以⽅便地通过 Flink Kafka Connector[2] 使 Flink 从 Kafka 中获得数据。
在这⾥需要提⼀下的是,如果想要将 MySQL 或其它数据源的变更⽇志存放在 Kafka 中后续供 Flink 处理,那么推荐使⽤ Canal 或Debezium 采集数据源变更⽇志,因为 Flink 1.11 原⽣⽀持解析这两种⼯具格式的 changelog,⽆需再额外实现解析器。
以 MySQL 作为数据源,经过 Kafka 的架构⽰例
以 TiDB 作为数据源
TiCDC[3] 是⼀款通过拉取 TiKV 变更⽇志实现的 TiDB 增量数据同步⼯具,可以利⽤其将 TiDB 的变更数据输出到消息队列中,再由Flink 提取。
以 TiDB 作为数据源,通过 TiCDC 将 TiDB 的增量变化输出到 Flink 中splitter函数
在 4.0.7 版本,可以通过 TiCDC Open Protocol[4] 来完成与 Flink 的对接。在之后的版本,TiCDC 将⽀持直接输出为 canal-json 形式,以供 Flink 使⽤。
案例与实践
上个部分介绍了⼀些基础的架构,实践中的探索往往更加复杂和有趣,这⼀部分将介绍⼀些具有代表性和启发性的⽤户案例。
⼩红书
⼩红书是年轻⼈的⽣活⽅式平台,⽤户可以通过短视频、图⽂等形式记录⽣活点滴,分享⽣活⽅式,并基于兴趣形成互动。截⾄到 2019年 10 ⽉,⼩红书⽉活跃⽤户数已经过亿,并持续快速增长。
在⼩红书的业务架构中,Flink 的数据来源和数据汇总处都是 TiDB,以达到类似于“物化视图”的效果:
1. 左上⾓的线上业务表执⾏正常的 OLTP 任务。
2. 下⽅的 TiCDC 集抽取 TiDB 的实时变更数据,以 changelog 形式传递到 Kafka 中。
3. Flink 读取 Kafka 中的 changelog,进⾏计算,如拼好宽表或聚合表。
4. Flink 将结果写回到 TiDB 的宽表中,⽤于后续分析使⽤。
⼩红书 Flink TiDB 集架构
整个过程形成了 TiDB 的闭环,将后续分析任务的 Join ⼯作转移到了 Flink 上,并通过流式计算来缓解压⼒。⽬前这套⽅案已经⽀持起了⼩红书的内容审核、笔记标签推荐、增长审计等业务,经历了⼤吞吐量的线上业务考验且持续运⾏稳定。
贝壳⾦服
贝壳⾦服持续多年深耕居住场景,积累了丰富的中国房产⼤数据。贝壳⾦服以⾦融科技为驱动,利⽤ AI 算法⾼效应⽤多维海量数据以提升产品体验,为⽤户提供丰富、定制化的⾦融服务。
在贝壳数据组的数据服务中,Flink 实时计算⽤于典型的维表 Join:
1. ⾸先,使⽤ Syncer (MySQL 到 TiDB 的⼀个轻量级同步⼯具)采集业务数据源上的维表数据同步到 TiDB 中。
2. 然后,业务数据源上的流表数据则通过 Canal 采集 binlog 存⼊ kafka 消息队列中。
stringbuilder读音3. Flink 读取 Kafka 中流表的变更⽇志,尝试进⾏流式 Join,每当需要维表中的数据时,就去 TiDB 中查。
4. 最后,Flink 将拼合⽽成的宽表写⼊到 TiDB 中,⽤于数据分析服务。
贝壳⾦服数据分析平台架构
利⽤以上的结构,可以将数据服务中的主表进⾏实时 Join 落地,然后服务⽅只需要查询单表。这套系统在贝壳⾦服已经深⼊各个核⼼业务系统,跨系统的数据获取统⼀⾛数据组的数据服务,省去了业务系统开发 API 和内存聚合数据代码的开发⼯作。
智慧芽
PatSnap(智慧芽)是⼀款全球专利检索数据库,整合了 1790 年⾄今的全球 116 个国家地区 1.3 亿专利数据和 1.7 亿化学结构数据。可检索、浏览、翻译专利,⽣成 Insights 专利分析报告,⽤于专利价值分析、引⽤分析、法律搜索,查看 3D 专利地图。
智慧芽使⽤ Flink + TiDB 替换了原有的 Segment + Redshift 架构。
原有的 Segment + Redshift 架构,仅构建出了 ODS 层,数据写⼊的规则和 schema 不受控制。且需要针对 ODS 编写复杂的 ETL 来按照业务需求进⾏各类指标的计算来完成上层需求。Redshift 中落库数据量⼤,计算慢(T+1 时效),并影响对外服务性能。
替换为基于 Kinesis +Flink + TiDB 构建的实时数仓架构后,不再需要构建 ODS 层。Flink 作为前置计算单元,直接从业务出发构建出Flink Job ETL,完全控制了落库规则并⾃定义 schema;即仅把业务
关注的指标进⾏清洗并写⼊ TiDB 来进⾏后续的分析查询,写⼊数据量⼤⼤减少。按⽤户/租户、地区、业务动作等关注的指标,结合分钟、⼩时、天等不同粒度的时间窗⼝等,在 TiDB 上构建出
DWD/DWS/ADS 层,直接服务业务上的统计、清单等需求,上层应⽤可直接使⽤构建好的数据,且获得了秒级的实时能⼒。
智慧芽数据分析平台架构
⽤户体验:在使⽤了新架构后,⼊库数据量、⼊库规则和计算复杂度都⼤⼤下降,数据在 Flink Job 中
已经按照业务需求处理完成并写⼊TiDB,不再需要基于 Redshift 的 全量 ODS 层进⾏ T+1 ETL。基于 TiDB 构建的实时数仓,通过合理的数据分层,架构上获得了极⼤的精简,开发维护也变得更加简单;在数据查询、更新、写⼊性能上都获得⼤幅度提升;在满⾜不同的adhoc 分析需求时,不再需要等待类似 Redshift 预编译的过程;扩容⽅便简单易于开发。手机如何安装linux系统
⽬前这套架构正在上线,在智慧芽内部⽤来进⾏⽤户⾏为分析和追踪,并汇总出公司运营⼤盘、⽤户⾏为分析、租户⾏为分析等功能。
⽹易互娱
⽹易 2001 年正式成⽴在线游戏事业部,经过近 20 年的发展,已跻⾝全球七⼤游戏公司之⼀。在 App Annie 发布的“2020 年度全球发⾏商 52 强”榜单中,⽹易位列第⼆。
mysql面试题 知乎
⽹易互娱数据计费组平台架构
在⽹易互娱计费组的应⽤架构中,⼀⽅⾯使⽤ Flink 完成业务数据源到 TiDB 的实时写⼊;另⼀⽅⾯,以 TiDB 作为分析数据源,在后续的Flink 集中进⾏实时流计算,⽣成分析报表。此外,⽹易互娱现在内部开发了 Flink 作业管理平台,⽤于管理作业的整个⽣命周期。
知乎
知乎是中⽂互联⽹综合性内容平台,以“让每个⼈⾼效获得可信赖的解答”为品牌使命和北极星。截⾄ 2019 年 1 ⽉,知乎已拥有超过2.2 亿⽤户,共产出 1.3 亿个回答。
知乎作为 PingCAP 的合作伙伴,同时也是 Flink 的深度⽤户,在⾃⼰的实践过程中开发了⼀套 TiDB 与 Flink 交互⼯具并贡献给了开源社区:pingcap-incubator/TiBigData[5],主要包括了如下功能:
1. TiDB 作为 Flink Source Connector,⽤于批式同步数据。
2. TiDB 作为 Flink Sink Connector,基于 JDBC 实现。
3. Flink TiDB Catalog,可以在 Flink SQL 中直接使⽤ TiDB 的表,⽆需再次创建。
在 docker-compose 中进⾏尝试
为了⽅便读者更好的理解,我们在 github/LittleFall/flink-tidb-rdw 中提供了⼀个基于 docker-compose 的 MySQL-Flink-TiDB 测试环境,供⼤家测试使⽤。
Flink TiDB 实时数仓 Slides[6] 中提供了该场景下⼀个简单的教程,包括概念解释、代码⽰例、简单原理以及⼀些注意事项,其中⽰例包括:
1. Flink SQL 简单尝试
2. 利⽤ Flink 进⾏从 MySQL 到 TiDB 的数据导⼊
3. 双流 Join
4. 维表 Join
在启动 docker-compose 后,可以通过 Flink SQL Client 来编写并提交 Flink 任务,并通过 localhost:8081 来观察任务执⾏情况。
如果⼤家对 Flink+TiDB 实时数仓⽅案有兴趣、疑惑,或者在探索实践过程中积累了想要分享的经验,欢迎到 TiDB 社区(如
AskTUG[7])、Flink 社区(如 Flink 中⽂邮件[8])或通过我的邮件(qizhi@pingcap)进⾏探讨。
参考阅读
Flink 中⽂社区关于实时数仓概念及流上 Join 的讨论:
基于 Flink 的典型 ETL 场景实现⽅案 mp.weixin.qq/s/l--W _GUOGXOWhGdwYqsh9A
⼩红书使⽤ TiDB 的实践分享⽂章:
How We Use a Scale-Out HTAP Database for Real-TimeAnalytics and Complex Queries en.pingcap/case-stu dies/how-we-use-a-scale-out-htap-database-for-real-time-analytics-and-complex-queries
TiDB的 HTAP 架构以及在数据平台上的应⽤:
How We Build an HTAP Database That Simplifies Your DataPlatform dzone/articles/how- we-build-an-htap-database-that-simplifies-your

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。