随着在线平台的发展,票务行业逐渐实现了数字化经营,企业可以通过在线销售、数字营销和数据分析等方式提升运营效率与用户体验。基于此,国内某头部票务平台为了更好地处理和分析各剧院的票务销售、分销渠道、用户画像等数据,决定引入 Apache Doris 开启实时数仓构建之旅。本文将详细介绍该票务平台基于 Apache Doris 实时数仓的搭建过程与报表开发场景下的应用实践,并分享实时数仓如何在报表开发和查询两方面提升性能,如何在系统维护和数据处理方面保持低成本运行的收益与成果。
作者|国内某头部票务平台 大数据开发工程师 刘振伟
近年来,文化产业在全球范围内快速发展,成为了经济增长的重要支柱。剧院票务作为文化产业的重要组组成部份,也得到了更多的关注。随着在线平台的发展,票务行业逐渐实现了数字化经营,企业可以通过在线销售、数字营销和数据分析等方式提升运营效率与用户体验。
基于此,国内某头部票务平台为了更好地处理和分析各剧院的票务销售、分销渠道、用户画像等数据,决定搭建实时数据仓库,并建设高效快捷的数据分析系统,将系统应用于常规业务报表、敏感数据监控以及票务推荐等应用。希望通过数据报表对剧院票务进行精细化地分析与处理,最终赋能营销策略、掌握市场需求,并达到票务销量增长。本文将详细介绍该票务公司引入 Apache Doris 实时数仓的搭建过程与报表开发场景下的应用实践,并分享在数据导入、数据开发、数据查询与系统运维等方面的收益成果。
考虑到剧院票务在各类演出上线后会出现订单激增的情况,实时数仓的时效性十分关键。票务平台期望数仓在报表开发和查询两方面能够提供高效性能,同时在系统维护和数据处理方面保持低成本运行。 因此,我们票务平台对于市面上常用于报表开发的数据仓库(Apache Hive、Clickhouse、Apache Doris)进行了详细对比与分析。
在初步了解后,首先放弃了 Apache Hive 。主要因为 Apache Hive 是离线数仓,对数据进行批量处理,报表按照 T+1 的调度周期展示结果,无法满足实时数据更新的要求。在进一步了解后也排除了 Clickhouse 选项。一方面 Clickhouse 对 SQL 查询语法不够友好,虽然支持了 Join 语义,但在进行多表 Join 时表现性能低,复杂的关联查询会引起内存溢出,无法满足我们对报表查询的需求。另一方面,Clickhouse 的架构复杂,对于组件依赖严重,容易出现集群稳定性的问题。在面对海量新增数据时,业务人员需要对系统不断进行调优,不仅增加使用成本,还会增加运维管理的难度。
因此,在多方面了解和对比后,我们发现 Apache Doris 更符合票务平台业务需求,特别是在使用方式、架构设计、数据导入与处理方面都具有极大优势,具体表现为:
基于 Apache Doris,票务平台开始了实时数仓构建之旅。我们平台的票务数据主要来自 MySQL 业务库、业务埋点数据、日志数据以及其他数据,在对数据进行采集后,同步至 Apache Kafka 消息队列并通过 Routine Load 导入到 Doris 数仓中。Apache Doris 主要作用于数据仓库分层以及直接应对前端业务报表的查询。如上方架构图所示,实时数仓共分为五层:
基于剧院票务的多样外部数据源,采用分层管理方式可以简化数据清洗过程,使每一个数据层都具有其明确的作用域和职责,在使用表时能够更易于定位和理解。开发通用的中间层数据还可以大大减少重复计算,实现准实时数据拉宽。此外,分层提供了统一的数据出口,确保对外输出口径一致,方便后续数据查询与分析。
在数仓应用后,我们对数据接入进行了优化处理,采取 Flink CDC 进行数据同步,实现对新架构稳定接入,进一步减少数据维护成本。
在业务初期,开发人员使用 DataX 进行外部数据源的全量和增量抽取,以实现离线数据同步,并借助 Canal 解析 MySQL Binlog 进行实时数据的同步。然而,这种方式无法保证数据接入的稳定性。为了解决这一问题,开发人员决定引入 Flink CDC 来执行数据同步。为了在短时间内获取业务所需报表,还采取了全库同步的方式对动态新增表进行同步,具体思路如图所示:
作为剧院票务的管理后台,票务数据平台主要利用 Apache Doris 进行报表开发,提供所需数据分析,以帮助业务人员对票务进行管理,提高票务销量。针对不同的报表场景,业务分析的侧重点有所不同,主要体现在:
根据以上报表场景的特点、使用范围与开发需求,我们选择 Doris 自带的多种数据模型进行高效的报表开发。在满足开发性能要求的同时,还实现了对实时数仓的低成本运维以及低成本存储。Doris 的引入为我们带来了以下具体应用收益:
在最常用的统计报表开发场景中,面对数据量巨大且数据繁杂的情况,我们采用了 Aggregation Key 模型来实现数据的自动聚合。通过使用相同的 Key 对列进行合并,提前进行聚合,大幅提升了开发效率。以销售员销售报表为例,将同一个销售员与按天维度的支付时间作为相同的 Key 值,票房收入作为值来进行自动聚合。一旦数据进入该报表中,即可直接为业务人员所用。在引入 Doris 之前,开发一张报表需要半天甚至一天时间,而现在开发周期缩短至 10 - 30 分钟,有效解决开发周期长的痛点,使开发效率极大提升。
在敏捷报表开发场景中,业务人员时常需要了解活动当天的数据,并在一定周期时间内形成汇总报表对活动进行复盘分析。因此不论是对开发报表的速度,还是对前端人员查询报表时的响应速度都有极高的要求。以 GMV 月报数据为例,我们需要在活动当月对对成交量进行统计汇总,并通过报表分析票务增速,评估活动效果。
在前期搭建数仓 DWD 明细层时,我们已经利用 Unique Key 模型实现了数据行级别更新,确保 GMV 报表所需数据的覆盖,无需再花费时间进行开发。在这一基础上,我们还利用了 SQL 多表 Join 进行聚合,借助 Doris Rollup 功能创建物化索引以缩短数据扫描的时间, 加速查询响应。通过两者结合的方式,报表展示从之前的十秒缩短至秒级或者毫秒级,响应速度提升了数十倍。
数据导入的效率与便捷性是衡量数据仓库最重要的因素之一。我们利用 Doris Insert Into 和丰富的内置导数方式,对本地数据、外部存储数据、Kafka 日志等数据源进行导入,并且在导入数据的同时还可以对其进行列映射、转换和过滤的操作,有效解决了早期导数过程中数据重复采集和不同数据源导致操作复杂性的问题。同时,Doris 对接入源脚本支持了半自动化代码的功能,我们只需要在配置表增加表名,即可快速接入数据,不再需要手工编写脚本,大大提高了导数效率。
Doris 架构简单,只有 FE 和 BE 两个进程,扩缩容方便快捷,系统升级也非常简单,只需要替换相关的安装包即可。同时,Doris 对集群配置信息和状态信息提供了便捷灵活的管理方式,我们可以通过获取专门的 URL,制定监控规则以便及时地调整各类配置参数,时刻保持 Doris 集群稳定快速地运行。以上这些功能都降低了我们在系统运维的成本和难度。
当前,我们的票务平台已经基于 Apache Doris 搭建了实时数据仓库,并全面覆盖了报表的开发与分析,帮助剧院后台实时分析销量情况。未来,公司将基于 Doris 不断探索与优化,我们将重点推进以下几个方面的工作:
领取专属 10元无门槛券
私享最新 技术干货