荔枝微课基于Apache Doris 统一实时数仓建设实践 亿级大表毫秒关联 (荔枝微课发展现状)

荔枝微课基于Apache Doris 统一实时数仓建设实践 亿级大表毫秒关联 (荔枝微课发展现状)

作者 | 陈城,数据中台组组长

深圳十方融海科技有限公司成立于 2016 年,是一家数字职业在线教育头部企业,业务涵盖“数字职业技能课程、知识分享平台「荔枝微课」、智慧教育解决方案「女娲云教室」”,推出了多类数字素养与数字技能课程服务,助力用户在数字时代实现技能进阶与职业进阶。2016 年上线荔枝微课,已发展成为国内头部知识分享平台。2021 年上线女娲云教室,实现了“教学练”一体化模式,填补了国内在线教学与实操脱轨的空白。

业务介绍

荔枝微课隶属于深圳十方融海科技有限公司,是一个免费使用的在线教育平台。荔枝微课拥有海量的知识内容,包括直播视频、录播视频、音频等多种形式。

通过技术和数据的赋能,推进荔枝微课持续创新,也为微课平台方和合作伙伴在视频的创新和销售方面提供了更强劲的支持。在业务运营过程中我们需要对用户进行全方位分析,高效为业务赋能。数据平台旨在集成各种数据源的数据,整合形成数据资产,为业务提供用户全链路生命周期、实时指标分析、标签圈选等分析服务。

早期架构及痛点

早期架构选用的是 Hadoop 生态圈组件,以 Spark 批计算引擎为核心构建了最初的离线数仓架构,基于 Flink 计算引擎进行实时处理。从源端采集到的业务数据和日志数据将分为实时和离线两条链路:

问题与挑战:

基于的早期架构可以满足我们的初步需求,而面对较为复杂的分析诉求则显得心有余而力不足,再加上近年来,荔枝微课用户体量不断上升,数据量呈指数级上升,为了更好的为业务赋能,提高用户使用体验,业务侧对数据的实时性、可用性、响应速度也提出了更高的要求。在这样的背景下,早期架构暴露的问题也越发明显:

技术选型

通过对数据规模及早期架构存在的问题进行评估,我们决定引入一款实时数仓来搭建新的数据平台,同时希望新的 OLAP 引擎可以具备以下能力:

基于以上要求,我们快速定位了 Apache Doris 和 ClickHouse 这两款开源 OLAP 引擎 ,这两款引擎都是当下使用较为广泛、口碑不错的产品。在调研中发现, ClickHouse 对 Join 能力的支持较为一般,而我们在大多数业务场景中都需要基于明细数据进行大数据量的 Join,同时 ClickHouse 不支持高并发,这也与 Apache Doris 形成鲜明的对比,Apache Doris多表 Join 能力强悍,高并发能力优异,完全可以满足我们日常的业务报表分析需求。除此之外,Apache Doris 可以同时支持实时数据服务、交互数据分析和离线数据处理多种场景,并且支持 Multi Catalog ,可以实现统一的数据门户,这几个特点都是我们核心考虑的几个能力。

当然在其他方面,Apache Doris的优势也比较明显,比如架构简单、支持 MySQL 协议,部署方便快速,运维零门槛,国内项目社区非常活跃,团队给予社区专业的技术支持,等等,这些方面都远胜于 ClickHouse,因此我们决最终定使用 Apache Doris 来搭建新的架构体系。

新的架构及方案

在新的架构中我们采取 Apache Doris 和 Apache Flink 来构建实时数仓,多种数据源的数据经过 Flink CDC 或 Flink 加工处理后,入库到 Kafka 和 Apache Doris 中,最终由 Doris 提供统一的查询服务。

架构收益

搭建历程

数据建模

结合 Apache Doris 的特性,我们对数据仓库进行了建模,建模方式与传统数仓类似:

1、ODS 层: ODS 层日志数据选择 Duplicate 模型的分区表,分区表方便进行数据修复,Duplicate 模型还可以减少非必要的 Compaction。ODS 层业务库数据采用 Unique 数据模型(业务库 MySQL 单表数据通过 Flink CDC 实时同步到 Doris,Kafka 日志数据经 Flink 清洗,通过 Doris 的 Routine Load 写入 Doris 作为 ODS 层), DISTRIBUTED BY HASH KEY 根据具体的业务场景进行选择:

2、DWD 层:

3、DWS 层和 ADS 层: 主要采用 Unique 数据模型,DWS 层根据数据量大小按天、月进行分区。除此之外,我们还会利用 INSERT INTO 语句进行 5 分钟的任务调度和 T+1 的任务修复来进行数仓分层,便于需求的快速开发和实时数据修复。对于 Duplicate 模型的数据表,我们会创建 Rollup 的物化视图,通过击中物化视图查询能够加快上层表查询效率。

数据开发

在荔枝微课业务中,运营人员经常会有调整直播课程信息、修改专栏名称等操作,针对维度快速变化但宽表中维度列没有及时更新的场景,为了能更好的满足业务需求,我们 利用 Doris Aggregate 模型 的 REPLACE_IF_NOT_NULL 字段特性,通过 Flink CDC 多表分别写入 Doris 维度表的部分列。 当课程维度表数据发生变化时,需要查询上层维度(专栏和直播间),对维度表补全,再将数据插入到 Doris 中;当上层维度(专栏和直播间)发生变化时,需要下钻查询课程表,补全对应的课程 ID ,再将数据插入到 Doris 中。通过该方式可以保证维度表中所有字段的实时性,数据查询时再通过宽表来关联维表补全维度字段展示数据。

库表设计

在初期设计阶段,为了更好的利用 Apache Doris 提供的 Colocation Join 功能,我们特别设计了事实表的主键,如下图示例:

在业务库中课程表 A 和课程表 B 的关系是 A.id=B.lecture_id ,为了实现 Colocation Join,我们将 B 的 distributed by hash key 设置为 lecture_id 。当面对多事实表时,先进行 Colocation Join ,再进行维度 Bucket Shuffle Join ,以实现快速查询响应。而使用这个方式可能导致以下问题:

基于以上问题,我们尝试进行调整,并对查询效率和机器资源的占用这两方面进行了评估权衡,最终决定在尽量不影响查询效率的前提下,尽可能提高资源利用率。

数据管理

在数据管理方面,我们进行了以下操作:

收益总结

在新架构中我们从 Hadoop 生态完全的迁移到 Flink + Doris 上,在上层构建不同的数据应用,比如自助报表、自助数据提取、数据大屏、业务预警等,Doris 通过应用层接口服务项目统一对外提供 API 查询,新架构的应用也为我们带来了许多收益:

未来规划

荔枝微课在引入 Apache Doris 之后,在内部得到了非常广泛的应用,满足了各业务场景需求、实现降本提效,深得十方融海各数据部门高度认可。未来我们期待Apache Doris在实时数据处理场景的能力上有更进一步的提升,包括 Unique 模型上的部分列更新、单表物化视图上的计算增强、自动增量刷新的多表物化视图等,通过不断的迭代更新,使实时数仓的构建更加简单易用。

声明:本文来自用户分享和网络收集,仅供学习与参考,测试请备份。