Doris实践——票务平台的实时数仓建设

news2024/11/27 10:31:54

目录

前言

一、引入 Doris原因

二、基于Doris搭建数据平台

2.1 构建实时数仓

2.2 Flink CDC全库同步

三、基于Doris进行OLAP报表开发

四、未来规划


   原文大佬介绍的这篇票务平台的实时数仓建设有借鉴意义,现摘抄下来用作沉淀学习。如有侵权,请告知~

前言

     随着在线平台的发展,票务行业逐渐实现了数字化经营,企业可以通过在线销售,数字营销和数据分析方式提升运营效率与用户体验。基于此,某头部票务平台为了更好的处理和分析各剧院的票务销售,分销渠道,用户画像等数据,引入了 Apache Doris开启实时数仓构建之旅。下文详细介绍该票务平台基于Apache Doris实时数仓的搭建过程与报表开发场景下的应用实践,并分享实时数仓如何在报表开发和查询两方面提升性能,如何在系统维护和数据处理方面保持最低成本的收益成果。

一、引入 Doris原因

     考虑到剧院票务在各类演出上线后会出现订单激增的情况,实时数仓的时效性十分关键。票务平台期望数仓在报表开发和查询两方面能够提供高效性能,同时在系统维护和数据处理方面,同时在系统维护和数据处理方面保持最低成本运行。因此,对于市面上常用于报表开发的数据仓库(Apache Hive、Clickhouse、Apache Doris)进行了详细对比与分析。

    在初步了解后,首先放弃了 Apache Hive。主要是因为Hive是离线数仓,对数据进行批量处理,报表按照T+1的调度周期展示结果,无法满足实时数据更新的需求。在进一步了解后也排除了Clickhouse选项。一方面 Clickhouse 对 SQL 查询语法不够友好,虽然支持了Join语义,但在进行多表Join时表现性能低,复杂的关联查询会引起内存溢出,无法满足我们对报表查询的需求。另一方面,Clickhouse的架构复杂,对于组件依赖严重,容易出现集群稳定性的问题。在面对海量新增数据时,业务人员需要对系统进行不断进行调优,不仅增加使用成本,还会增加运维管理的难度。

     因此,在多方面了解和对比后,发现 Apache Doris 更符合票务平台的业务需求,特别是在使用方式,架构设计,数据导入与处理方面都具有极大优势,具体表现为:

  • 简单易用:Apache Doris 基于 MySQL 协议,支持标准的 SQL 查询语法,使开发人员能够快速上手使用。Doris 的架构非常精简,整体部署只有 FE 与 BE 两种角色,并且支持纯净安装,使架构无需再依赖其他组件。
  • 灵活配置监控:Doris 通过获取专门的 URL 来制定监控规则以达到优化集群状态和性能监控的目的。通过及时调整 FE、BE 角色的配置参数,始终确保数仓稳定快速的运行。
  • 数据模型丰富:通过使用 Doris 自带的三种数据模型,可以有效的加速ETL开发过程。业务人员可以基于不同的数仓分层选用合适的模型来实现高效的数据导入,也可以根据不同的业务场景选择合适的模型进行报表开发。
  • 查询性能更优:Doris 的物化视图和物化索引功能可以实现预计算结果,并在命中物化视图时实现快速响应,达到秒级或毫秒级的查询展示。此外,在进行大表Join时,Doris 还提供多种优化机制,进一步提升查询效率。

二、基于Doris搭建数据平台

2.1 构建实时数仓

    基于 Apache Doris,票务平台进行了实时数仓构建实践。票务数据主要来自Mysql业务库、埋点数据、日志数据以及其他数据,再对数据进行采集后,同步至Apache Kafka消息队列并通过 Routine Load导入至Doris数仓中。Apache Doris主要作用于数据仓库以及直接应对前端业务报表的查询。如上方架构图所示,实时数仓共分为五层:

  • ODS贴源层:主要存放未经处理的原始数据结构,与 MySQL 原系统保持一致,是数据仓库的准备区域。统一采用 Unique Key数据模型,能够有效防止数据重复采集,减少任务失败。
  • DWD明细层:存放维度建模的事实表,对生产数据进行清洗,统一格式,脱敏等,保存各业务过程中最小粒度的操作记录,同样在明细层主要采用了 Unique Key 模型,用相同的 Key进行数据覆盖实现行级的数据更新。
  • DWS汇总层:以明细层数据为基础,依据业务需求划分数据主题(如订单,用户等),将相同粒度数据进行关联合成宽表。该表使用Unique Key 和 Aggregate Key两种模型进行数据轻度汇总为后续的业务查询和OALP分析做准备。
  • ADS 应用层:基于以上三层数据存放各项指标统一结果。主要利用 Aggregate Key模型进行高度自动聚合,为满足前端人员的具体分析需求,直接提供查询展现。
  • DIM 维表层:在 DIM 层中,主要存放剧院数据,项目数据,场次数据等。在实际应用中,维度数据会结合订单明细数据来进行使用。

2.2 Flink CDC全库同步

    在数仓应用后,对数据接入进行了优化处理,采取Flink CDC进行同步,实现对新架构稳定接入,进一步减少数据维护成本。

 在业务初期,开发人员使用Datax进行外部数据源的全量和增量抽取,以实现离线数据同步,并借助Canal 解析MySQL Binlog进行实时数据的同步。然而,这种方式无法保证数据接入的稳定性。为了解决这一类问题,开发人员决定引入 Flink CDC 来执行数据同步。为了在短时间内获取业务所需报表,还采取了全库同步的方式对动态新增表进行同步,具体思路如下图所示:

  • 在mysql数据库中对表管理配置数据进行动态更新。
  • 利用 Flink,在Job任务中创建两个CDC捕获任务。其中一个数据流负责捕获变更数据,另一个广播流负责进行更新配置。
  • 在Sink端配置所有全库的表,当表新增时,会触发广播流更新配置数据。( 在 Sink 端配置所有全库的表,只配置该表,暂时不用创建对应的表。)

三、基于Doris进行OLAP报表开发

作为剧院的管理后台,票务数据平台主要利用 Apache Doris 进行报表开发,提供所需数据分析,以帮助业务人员对剧院票务进行管理,提高票务销量。针对不同的报表场景,业务分析的侧重点有所不同,主要体现在:

  • 统计报表:该报表是业务分析使用频率最高的报表,主要涉及100多家剧院的销售数据,包括分销渠道销售明细,销售员销售报表,演出明细报表,纠错报表,场次汇总报表等。
  • 敏捷报表:针对特定活动进行报表开发,业务数据主要来自商业化运营,包括日项目数据汇总、周项目数据汇总、销售额数据汇总、GMV 月报数据、平台分销渠道数据、财务结算报表等。
  • 数据分析:显示该剧院的运营情况,包括阅读会员日订单情况,销售收入情况、上座率、会员重复下单数量、用户画像分析等。
  • 数据大屏:主要用于展示订单数据趋势、巨量销售趋势、提供数据视图。

     根据以上报表场景的特点,使用范围与开发需求,选择Doris 自带的多种数据模型进行高效的报表开发。在满足开发性能需求的同时,还实现了对实时数仓的低成本运维以及低成本存储,Doris 的引入带来了以下具体应用收益:

  • Join + Rollup实现查询响应达毫秒级

    在敏捷报表开发场景中,业务人员时常需要了解活动当天的数据,并在一定周期时间内形成汇总报表对活动进行复盘分析。因此不论是对开发报表的速度,还是对前端人员查询报表时的响应速度都有极高的要求。以 GMV 月报数据为例,需要在活动当月对成交量进行统计汇总,并通过报表分析票务增速,评估活动效果。

   在前期搭建数仓 DWD 明细层时,已经利用 Unique Key 模型实现了数据行级别更新,确保GMV报表所需数据的覆盖,无需再花费时间进行开发。在这一基础上,还利用了 SQL 多表 Join 进行聚合,借助了 Doris Rollup功能创建物化索引以缩短数据扫描的时间,加速查询响应。通过两者结合的方式,报表展示从之前的十秒缩短至秒级或毫秒级,响应速度提升了数十倍

  • 持多源异构数据,导数效率大幅提升

     数据导入的效率与便捷性是衡量数据仓库最重要的因素之一。利用Doris Insert Into和丰富的内置导数方式,对本地数据,外部存储数据,kafka日志等数据源进行导入,并且在导入数据的同时还可以对其进行列映射、转换和过滤操作,有效解决了早期导数过程中数据重复采集和不同数据源导致操作复杂性的问题。同时,Doris 对接入源脚本支持了半自动化代码的功能,只需要在配置表增加表名,即可快速接入数据,不再需要手工编写脚本,大大提高了导数效率。

  • 架构链路清晰,实现低成本运维

   Doris架构简单, 只有FE和BE两个进程,扩缩容方便快捷,系统升级也非常简单,只需要替换相关的安装包即可。同时,Doris对集群配置信息和状态信息提供了便捷灵活的管理方式,可以通过获取专门的url,制定监控规则以便及时的调整各类配置参数,时刻保持 Doris 集群稳定快速地运行。以上这些功能都降低了我们在系统运维的成本和难度。

四、未来规划

   当前票务平台已经基于 Doris搭建了实时数据仓库,并全面覆盖了报表的开发与分析,帮助剧院后台实时分析销量情况。未来,将基于Doris不断探索与优化,将重点推进以下几个方面的工作:

  • 集群优化:加强指标管理体系、数据质量监控体系,对Doris集群进行性能优化升级;
  • 实时拉宽:强数仓血缘关系的管理,使准实时的数据拉宽升级为实时数据拉宽,达到数据高度一致与实时同步;
  • 扩大Doris 使用范围:逐步将实时数仓应用至票务推荐系统,基于 Doris 对用户购买行为和市场趋势推荐对应的产品,进一步提升票务销量。

参考文章:

Apache Doris 在头部票务平台的应用实践:报表开发提速数十倍、毫秒级查询响应

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1558474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高效解决Visual Studio无法识别到自定义头文件

文章目录 问题解决方案 问题 说明你没有好好配置项目属性 解决方案 把头文件都集中存放到一个文件夹里 之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路…

【c++】类和对象(六)深入了解隐式类型转换

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章我们来到初始化列表,隐式类型转换以及explicit的内容 目录 1.初始化列表1.1构造函数体赋值1.2初始化列表1.2.1隐式类型转换与复制初始化 1.3e…

Learning from Multiple Annotator Noisy Labels via Sample-wise Label Fusion

confusion matrix P n ( r ) _n^{(r)} n(r)​ pillow8.3.1和python3.7.11的环境不好满足,不建议复现

笔记: JavaSE day16笔记 - string字符串

第十六天课堂笔记 学习任务 Comparable接口★★★★ 接口 : 功能的封装 > 一组操作规范 一个抽象方法 -> 某一个功能的封装多个抽象方法 -> 一组操作规范 接口与抽象类的区别 1本质不同 接口是功能的封装 , 具有什么功能 > 对象能干什么抽象类是事物本质的抽象 &…

RocketMQ(版本4.9.4)+RocketMQ_Dashbord环境搭建(生产者、消费者的前置环境搭建)

一、官方网站下载 RocketMQ源码包 https://rocketmq.apache.org/zh/docs/4.x/introduction/02quickstart 二、把rocketMQ上传到Linux环境下解压,编译,执行以下命令(需要提前装jdk和maven并配置好环境变量) unzip rocketmq-all-4…

短视频账号矩阵系统/开发 -- -- -- 蒙太奇算法上线

短视频账号矩阵系统,短视频矩阵系统开发3年技术之路,目前已经在技术竞品出沉淀出来,近期技术迭代的新的功能同步喽: php7.4版本,自研框架,有开发文档,类laravel框架 近期剪辑迭代的技术算法&am…

Unix信号处理

信号的基本概念我已经在上一节中简单介绍了&#xff0c;大家可以去看我的上一篇博客&#xff1a; Unix中的进程和线程-2-CSDN博客 1.信号的产生 kill函数&#xff1a; #include <signal.h> #include <fcntl.h> #include<t_stdio.h> //自定义信号处理函数,n为…

深度学习算法概念介绍

前言 深度学习算法是一类基于人工神经网络的机器学习方法&#xff0c;其核心思想是通过多层次的非线性变换&#xff0c;从数据中学习表示层次特征&#xff0c;从而实现对复杂模式的建模和学习。深度学习算法在图像识别、语音识别、自然语言处理等领域取得了巨大的成功&#xf…

深入理解数据结构(3):栈和队列详解

文章主题&#xff1a;顺序表和链表详解&#x1f331;所属专栏&#xff1a;深入理解数据结构&#x1f4d8;作者简介&#xff1a;更新有关深入理解数据结构知识的博主一枚&#xff0c;记录分享自己对数据结构的深入解读。&#x1f604;个人主页&#xff1a;[₽]的个人主页&#x…

吴恩达机器学习笔记 三十一 K-means算法及优化目标 成本函数

随机初始化 K 个集群质心&#xff0c;这里设质心个数为2 第一步&#xff1a;分配点给集群质心 对 m 个 点&#xff0c;每个点对应的质心为 c(i) ,若离红色的质心近&#xff0c;则 c(i) 的值为1&#xff0c;否则为2。计算距离用的是L2范式。 第二步&#xff1a;移动集群质心 …

Verilog语法回顾--用户定义原语

目录 用户定义原语 UDP定义 UDP状态表 状态表符号 组合UDP 电平敏感UDP 沿敏感时序UDP 参考《Verilog 编程艺术》魏家明著 用户定义原语 用户定义原语&#xff08;User-defined primitive&#xff0c;UDP&#xff09;是一种模拟硬件技术&#xff0c;可以通过设计新的原…

Yolov7 Reid【附代码,行人重识别,可做跨视频人员检测】

本项目使用Yolov7Reid实现的行人重识别功能&#xff0c;可做跨视频人员检测。 应用场景&#xff1a; 可根据行人的穿着、体貌等特征的Reid算法在视频中进行检索&#xff0c;可以把这个人在各个不同摄像头出现时检测出来。可应用于犯罪嫌疑人检索、寻找走失儿童等。支持GUI界面…

Python API(happybase)操作Hbase案例

一、Windows下安装Python库&#xff1a;happybase pip install happybase -i https://pypi.tuna.tsinghua.edu.cn/simple 二、 开启HBase的Thrift服务 想要使用Python API连接HBase&#xff0c;需要开启HBase的Thrift服务。所以&#xff0c;在Linux服务器上&#xff0c;执行如…

scikit learn数据预处理学习笔记

数据集及基本操作 1&#xff09;数据集的组成 数据集由特征(feature)与标签(label)构成。 特征是输入数据。 什么是特征&#xff08;Features&#xff09;: 机器学习中输入数据&#xff0c;被称为特征。通常特征不止1个&#xff0c;可以用 n 维向量表示n个特征。 Features 数…

设备树语法

设备树语法 1 Devicetree格式1.1 DTS文件格式1.2 node格式1.3 properties格式 2 dts文件包好desi文件3 常用的 属性 properties3.1 #address-cells、#size-cells3.2 compatible3.3 model3.4 status3.5 reg&#xff08;设备不同reg属性的含义就不同&#xff09;3.6 name、device…

链式前向星解析

树形DP涉及到图存储&#xff0c;先复习一下链式前向星存储图&#xff0c;便于理解上篇的树形DP。对于图数据结构的存储&#xff0c;我们除了采用邻接矩阵&#xff08;消耗空间&#xff0c;不常用&#xff09;、邻接表&#xff0c;还有一种方法就是链式前向星。 链式前向星存储图…

数据结构——线性表(一)

线性表&#xff0c;顾名思义&#xff0c;是具有像线一样的性质的表。如同学生们在操场上排队&#xff0c;一个跟着一个排队&#xff0c;有一个打头&#xff0c;有一个收尾&#xff0c;在其中的学生都知道前一个是谁&#xff0c;后一个是谁&#xff0c;这样就像一根线将他们都串…

[HNCTF 2022 WEEK2]来解个方程?

标准的Z3题&#xff0c;可以拿来当模版题 题目逻辑很简单 直接看check from z3 import * # 初始化求解器 s Solver() # 定义6个未知数 n 24 x [Int(s str(i)) for i in range(0,24)] s.add(245 * x[6] 395 * x[5 ] 3541 * x[4 ] 2051 * x[3 ] 3201 * x[2 ] 1345 * x[7 ] 8…

中制交通安全统筹闪耀资本市场,成功上市引领行业新篇章

3月30日上午,随着上市钟声的敲响,中制(海南)交通安全统筹服务有限公司(股票代码:HK 31598)在香港股权交易展示中心挂牌上市,中制交通安全统筹董事长熊辉、联合创始人兼CEO张国伟、董事石杰等公司高管、股东、客户、合作伙伴出席挂牌仪式,共同见证敲钟上市,这也使中制交通安全统…

PonyAi Planning-横纵向轨迹规划

PonyAi Planning-横纵向轨迹规划 轨迹规划的探索和挑战 轨迹规划的概念安全舒适两不误&#xff1a;探讨优化算法在规划控制中的应用 轨迹规划的概念 决策 横向规划 纵向规划 优化算法在规划&#xff08;Planning&#xff09;中的应用 附赠自动驾驶学习资料和量产经验…