同程数科基于 Apache Doris 构建统一实时数仓,查询提速数十倍!

news2024/12/28 2:10:27

本文导读:

同程数科是同程集团旗下的旅游产业金融科技服务平台,为上下游企业和个人消费者提供数字金融科技服务。近年来,随着同程数科业务的不断拓展和用户量的增加,高效可靠的一站式数据中心建设已成为必不可少的需求。为帮助业务人员提升数据开发的效率与质量,同程数科历经三代架构演进,最终引入 Apache Doris 搭建统一实时数仓,在后续的实际应用中,将实时数仓平台化,进一步构建了一站式数据平台 Ark,为业务人员提供了简单易用、便于维护的系统,实现任务自主开发、灵活上线、简便查询、持续监控等使用功能。

作者:陈松,同程数科 大数据平台工程师

同程数科是同程集团旗下旅游产业金融科技服务平台,前身为同程金服,成立于 2015 年 11 月,以数字科技引领旅游产业,以科技的力量赋能旅游产业为愿景,为旅游公司在深层次的生态链条上构建竞争力,同时为旅游产业链上下游企业和个人消费者提供数字金融科技服务。同程数科的业务涵盖了旅游产业链金融服务、旅游消费金融服务、支付科技等板块,累计服务用户超过千万,涵盖 76 座城市。 目前,同程数科已获得首轮战略投资,联合多家产业金融机构,为旅游产业开拓新业务的服务平台。

近年来,随着同程数科业务的不断拓展和用户量的不断增加,我们越来越需要一个可靠、高效的数据中心,以帮助企业更好地了解业务运营情况和制定策略,这包括但不限于建立实时业务报表看板、实时业务指标预警、营销用户画像与标签、以及金融风控实时监测等分析工具。因此,我们更加关注于实时数仓的构建,希望利用数仓帮助业务人员提升数据开发的效率与质量,从而为业务分析提供强大的后盾。

基于此,我们开始了实时数据仓库的探索之旅。如今,数仓架构已经经历了三代演进,经过第一代离线架构与第二代 Lambda 架构的使用后,通过需求分析与调研,最终引入 Apache Doris 搭建了统一的实时数据仓库。本文将详细介绍三代架构的演进过程,分享我们如何基于 Apache Doris 搭建一站式数据平台 Ark,以及如何在业务使用、系统维护、数仓开发等方面达到降本增效的收益与成果。

早期架构演进

在大数据技术发展和运用的初期,同程数据以 Apache Hive 为核心建立了离线数仓,并使用 Hive 进行数仓分层。当数据从源头进入离线数仓后,通过 ODS 、DWD 、DWS 层级处理,数据输出至 MySQL、Redis、HBase 等应用数据库,以供报表平台使用。该架构虽然具有耦合性低、稳定性高等优势,但其缺点也比较明显,主要体现在当进行局部更新时需要对数据进行全量合并,流程冗长,使数据更新时间变长,时效性无法得到保证。随着数据规模不断增加,局部更新需求越来越多,该架构在数据计算效率低下和资源利用不充分的弊端也变得愈加明显。

基于第一代架构存在的问题,我们对架构进行了升级改造。第二代架构为典型的 Lambda 架构,在保留原有离线数仓的同时,新增了以 Apache Flink 与 Apache Kafka 为核心的实时数仓。在该架构中,离线链路主要对数据进行批量处理,负责解决周期性数据跑错的问题。新增的实时链路利用 Flink 对于数据源进行流式处理、利用 Kafka 对数仓分层,最终输出至应用数据库。

尽管该架构解决了第一代架构中数据时效性较低的问题,但是在长期的运行中,我们发现仍存在一些使用痛点:

  • 架构复杂,运维难度高: 由于两套链路同时运行,实时链路需要通过 Apache Flink 与 Apache Kafka 对数据进行流处理,离线链路需要利用 Apache Hive 与 Apache Spark 对数据进行批处理,并且两条链路的维表层中均利用 MySQL 或 Redis 进行存储,这导致整体架构涉及的组件过多,数据处理流程过于复杂。除此之外,该架构会重复计算相同的数据,导致整体资源占用增加、运维管理成本增加、后期维护难度增加。
  • 数据开发成本高: 实时数仓部分完全依赖 Apache Kafka 进行数仓分层,而 Kafka 对于数据的存储周期具有限制,新的数据导入任务需要进行额外的开发工作,这将极大增加开发成本。
  • 数据一致性低: 相同的数据在实时数仓中流处理,离线数仓中批处理,存在数据处理逻辑不统一的问题,数据一致性与准确性得不到保障。由于无法复用第一代架构中的数据血缘、数据质量等管理体系,在运行过程中,当实时链路出现乱序问题时,需要回放全量日志进行数据回溯,增加数据修复的复杂性。

Apache Doris 和 Clickhouse 选型对比

为了彻底解决早期架构的问题,在引入新架构之前,我们决定进行深度的产品调研来选择更适合的数仓搭建方案。我们发现 MPP 架构数据库能够支持统一实时的数据分析,可以有效解决 Lambda 架构复杂、数据一致性无法保障的问题,而这一产品细分下,Apache Doris 与 Clickhouse 比较匹配我们的业务诉求。基于此,我们对这两款 MPP 架构数据库进行了选型对比,并发现 Doris 的表现更加优异,非常符合我们的选型要求,具体表现如下:

  • 产品易用性: ClickHouse 不支持标准 SQL,而 Apache Doris 支持标准 SQL 并兼容 MySQL 协议,使开发人员上手简单,不需要付出额外的学习成本。
  • Join 性能优异: Doris 支持分布式 Join,查询灵活度较高,且性能表现优异。而 ClickHouse 由于 Join 查询限制、函数局限性以及可维护性较差等原因,不满足我们当前的业务需求。
  • 数据导入: Doris 的数据导入功能完备,支持 Routine Load、Stream Load 和 JDBC Insert Into 等多种数据导入方式,即使在海量数据下也能保持数据稳定写入,性能与速度远高于 ClickHouse。
  • 运维难度: Doris 架构精简,只有 FE 与 BE 两种角色,整体部署简单快速,同时 Doris 在扩容方面非常快捷,支持滚动升级,只需要替换相关安装包即可。而 ClickHouse 对组件依赖较高,在使用和扩容上需要做许多准备工作,这就要求提供一支专业的团队来支持日常的开发与运维工作。

更关键的是,Doris 可以同时支持实时数据服务、交互数据分析和离线数据处理等多场景。 Multi-Catalog 提供了联邦查询的能力,支持对多个数据源进行读取,提高数据的准确性和质量,简化任务开发流程。此外,这一功能可以使开发人员更快速地找到所需数据,减少查询时间和成本,提高查询效率。因此 Apache Doris 的高效运行性能和低开发成本的优势,更符合我们对一站式数据平台搭建的需求。

新一代统一实时数仓

引入 Apache Doris 后,我们对架构进行了重构。如上图所示,我们使用 Apache Doris 统一进行数据存储与计算,完全替代了原先的离线架构与 Lambda 架构,并构建了一站式数仓,不仅保证了数据的一致性,还实现了架构的精简,极大降低了架构运维成本。 其次,在数据源进入实时数仓时,我们新增了 Input 统一数据集成引擎,支持多种异构数据源的数据同步,实现数据入口的统一。总而言之,Doris 的引入真正帮助我们实现了数据集成、存储、计算、输出方面的统一,真正意义上实现了实时统一数仓。

基于 Apache Doris 的一站式数据平台

基于新一代的数仓,我们搭建了一站式数据平台 Ark,希望通过该数据平台实现任务开发、任务提交与测试、任务调度与监控、数据查询、集群监控等一体化服务,为内部人员在实际业务中提升任务开发效率,提高任务监控质量。

  • 数据开发: 我们希望外部数据接入 Apache Doris 时可以高效地进行 ETL 开发,提升报表产出速度。
  • 调度管理: 在业务人员开发完成并上线任务后,我们需要保证任务调度的稳定性以及调度恢复能力,避免问题发生。
  • 数据查询: 由于生产与办公网络中间有隔断,办公网络不能直接使用生产网络的连接,只能通过 Web 形式解决网络隔断,我们希望借助平台能够提供安全便捷地查询和分析方式。
  • 集群管理: 当集群出现异常状况时,我们希望平台能够及时监控捕捉并进行自动化处理。

一键生成任务脚本,提升任务开发效率

Apache Doris 支持丰富的数据源接入,利用这一功能,在 Ark 平台中可以根据不同的数据源,获取相对应的元数据信息来形成脚本,实现任务快速生成。在数据接入方面,平台进行了半自动化代码的相关工作,并创建了快速生成组件。如上图所示,在平台中输入数据源或表的信息可以自动生成 Routine Load 脚本。基于该脚本,只需要对 Apache Kafka 接入源进行 Topic 修改,即可马上生成 Routine Load 任务。同样,对于 Broker Load 的任务开发原理相同,在选择对应的数仓源之后,可以及时生成 Broker Load 所需脚本。利用 Doris 多源异构数据的写入能力,平台能够快速构建代码,实现对 Routine Load 与 Broker Load 的高效任务开发。

自动调度监控,保障任务正常运行

在任务开发与提交之后,平台可以针对 Routine Load 或者 Broker Load 任务进行查询、检查是否存在异常等常规调度操作。对于需要特别关注的任务,可以加入监控列表中,这样系统会定期自动地对任务进行扫描,发生问题时会进行提示并尝试将任务重新拉起。此外,由于 Routine Load 是常驻进程,对于该任务的监控,平台支持定期且持续的自动化监控功能,而对于 Broker Load 与其他常规任务,平台在定期扫描后会对失败的任务进行预警提示。

安全便捷的可视化查询分析

由于生产与办公网段隔离,我们只能通过 Web 进行查询,使用起来繁琐且不方便。为了解决这个问题,我们曾经尝试使用集成 Hue 的方式,使 Doris 通过 MySQL 协议连接到 Hue 进行数据查询,虽然查询过程有所简化,但是这种方法存在数据安全隐患。

因此,同程数科自行开发了内部查询分析页面,设置了权限管理,解决了查询安全性的问题。同时,在 Ark 平台中集成了 Doris Help 功能,使业务人员能够通过关键字搜索进行 SQL 语法和示例的查询,解决常规查询操作问题,以此降低学习成本,提高内部人员查询的便捷性。

完备智能的集群监控

通过 Apache Doris 集群监控页面可以实时监管 FE 、BE 以及 Broker 节点状况。当集群发生异常状况时,监控系统会发送自动提醒并尝试将集群拉起,及时对异常情况进行自动化处理,避免引发更大的问题。同时集群监控的看板也可以帮助我们观察节点的健康度情况,通过 FE 节点状态判断健康度高低。

总结收益与成果

当前,同程数科已经基于 Apache Doris 搭建了高度统一实时的数据仓库,并使用数十台 Doris 节点机器。此外,我们还将 Doris 功能平台化至 Ark 一站式数据平台中,实现对于 Ark 平台能够包罗万象的开发初衷。对于 Doris 的引入,为我们带来以下收益与成果:

  • 缩减开发周期:利用平台一键开发功能,业务人员能够自主开发,无需将需求提给大数据团队,开发时间由原来的半小时缩短到仅需三分钟,显著压缩了任务开发周期,开发效率提升了十倍;
  • 灵活数据开发:配合 Ark 一站式数据平台,数据开发能够灵活分析,需求可以快速上线;
  • 统一数据处理:Doris 在数据导入、存储、计算实现统一,保证数据一致性,实现真正意义的实时统一;
  • 提升查询效率:从过去分钟级效应时间到如今秒级甚至毫秒级,查询效率得到数十倍提升;
  • 降低学习成本:因为 Apache Doris 兼容 MySQL 协议,并且使用标准 SQL,在使用上简单易用。业务人员能够如同使用数据库一样使用大数据,从而进一步降低学习成本;
  • 降低运维成本: Doris 的部署简单,精简架构使整体链路体系简洁,便于维护。

未来规划

在未来,我们希望基于 Apache Doris 能够搭建实时数仓生态体系,并在同程数科的内部进行大规模使用。我们将会持续建设并优化基于 Apache Doris 一站式实时数仓架构,完善统一计算和存储、流批一体能力。对于 Ark 一站式数据平台持续迭代增强,整个实时数仓体系向着时效性、稳定性、灵活性发展。完善 Ark 数据集成平台的图形化功能,持续增加更多异构数据源之间的数据同步功能,增强引擎对数据的处理能力。

其次,我们将持续关注 Apache Doris 在数据湖分析方面的能力,我们希望在湖中能够对多源异构数据进行采集,实现数据统一存储、统一多范式计算,最后由 Doris 的 API 接口统一对外提供服务。另外,我们对于 Apache Doris 2.0 的尝鲜测试也非常感兴趣,特别是倒排索引功能和 JSONB 数据类型的优化,在后续的架构优化中我们会考虑利用倒排索引替换现有的日志系统,利用更新的 Json 数据类型进一步完善查询能力。

在此特别感谢 SelectDB 技术团队 长期以来的及时响应和技术支持。未来,我们也会更积极参与社区贡献及活动,与社区共同进步和成长,欢迎大家选择和使用 Doris,相信 Doris 一定不会让你失望!

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

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

相关文章

团体程序设计天梯赛-练习集L2篇④

🚀欢迎来到本文🚀 🍉个人简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的普通人。 🏀个人主页:陈童学哦CSDN 💡所属专栏:PTA 🎁希望各…

WPF 零基础入门笔记(1):WPF静态页面,布局+样式+触发器

文章目录 官方文档往期回顾零基础笔记项目实战(已完结) WPF项目创建为什么选net core版本 WPF 静态页面WPF 页面布局WPF样式Style样式行内样式行外样式如果是简单样式,可以这么写如果是复杂样式 WPF样式继承WPF触发器单条件触发器多条件触发 …

LLDP(链路层发现协议)详解及C/C++代码实现

LLDP(链路层发现协议)是一种IEEE标准协议(IEEE 802.1AB),它定义了封装在以太网帧中的消息,目的是通过默认情况下每30秒从每个端口定期重传一次,为设备提供一种向LAN(局域网&#xff…

20个Java编程技巧

1. 把字符串常量放在前面 通过把字符串常量放在比较函数equals()比较项的左侧来防止偶然的 NullPointerException 从来都不是一个坏主意,就像这样: 这是毫无疑问的,把一种表达式转换成另一种更好的表达式,并不会失去什么。只要我…

mysql锁机制及MVCC底层原理

一、锁介绍 按性能可分为乐观锁(适用于读多写少的情况下,如果是写多,导致过多cpu空转,影响性能)和悲观锁(适用于写多的情况)按数据库操作粒度可分为表锁、页锁、行锁按数据库操作类型可分为读锁…

UE4/5动画系列(1.模板制作)

目录 动画模板制作 同步模板组制作 有模板做什么都方便,所以这里我们做一个动画蓝图的模板(动物专用) 动画模板制作 第一步创建一个动画蓝图的模板 然后找到第三人称的模板,将其模板的蓝图改名: 在动画蓝图的模板里…

团体程序设计天梯赛-练习集L2篇②

🚀欢迎来到本文🚀 🍉个人简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的普通人。 🏀个人主页:陈童学哦CSDN 💡所属专栏:PTA 🎁希望各…

首个跨云元数据KV存储Xline正式进入CNCF沙箱

2023年6月13日,云原生计算基金会(CNCF)宣布Xline正式被纳入CNCF沙箱(Sandbox)项目。Xline是由达坦科技(DatenLord)于2022年年底推出的开源项目,是一个用Rust语言写就的,用于元数据管…

hello算法笔记之图

一、图的基础知识 图是一种非线性数据结构,由「顶点 Vertex」和「边 Edge」组成。 1.图的类型: 根据边是否具有方向可以分为有向图,无向图 根据所有顶点是否连通可以分为连通图(对于连通图,从某个顶点出发&#xf…

gdb系列-入门篇-day01

gdb基础命令 一个程序要被调试&#xff0c;编译的时候要加上-g选项&#xff0c;例如gcc -g … 先准备一个调试的小代码 #include <stdio.h>int hello() {printf("hello\n");return 0; }int main() {int a[5] {1,2,3,4,5};hello();for(int i0; i<5; i){pri…

springboot使用@Valid 和 @Validated 注解校验详解以及编写一个自定义全局异常类

package com.test.springvalid.config;import lombok.Data; import java.util.HashMap; import java.util.Map;/*** 通用返回结果&#xff0c;服务端响应的数据最终都会封装成此对象* param <T>*/ Data public class R<T> {private Integer code; //编码&#xff1…

Mybatis源码分析_Mapper接口是如何实例化的 (2)

我们在使用Springmybatis的时候&#xff0c;经常都是直接写一个接口和一个对应的 ***Mapper.xml文件&#xff0c;然后业务代码就可以直接注入这个接口了。它是如何做到的呢&#xff1f; 接口&#xff1a; xml 想搞清楚这个问题&#xff0c;那还是要从Mybatis底层源码进行分析的…

智能小车使用IIC屏幕做动作显示界面

一、简介 使用0.96寸IIC屏幕作为遥控动作的显示界面。 外设引脚 stm32f103c8t6单片机IIC引脚有两组 使用I2C1&#xff0c;对应的时钟与数据线分别为PB6、PB7。 IIC屏幕指令 // OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel // OLED_WR_Byte(0x00,OLED_CMD);//---se…

07- c语言指针 (C语言)

一 指针的引入 1、一般把内存中的一个字节称为一个内存单元。 2、为了正确地访问这些内存单元&#xff0c;必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址&#xff0c;通常也把这个地址称为指针。 3、如果在程序中定义…

车载网络测试 - CANCANFD - 基础篇_03

十、发送方式与过滤方式 1、广播发送及规则 我们以小组讨论现场为例来说明CAN总线广播发送规则&#xff1a; 1&#xff09;一个房间代表同一路CAN总线&#xff0c;每一个小组代表一个CAN Node&#xff0c;每一个小组成员发言代表发送一帧CAN报文&#xff0c;对所有的小组成员进…

生成对抗网络

1 GAN基本概念 1.1 GAN介绍 GAN的英文全称是Generative Adversarial Network&#xff0c;中文名是生成对抗网络。它由两个部分组成&#xff0c;生成器和鉴别器&#xff08;又称判别器&#xff09;&#xff0c;生成网络&#xff08;Generator&#xff09;负责生成模拟数据&…

【Python】异常处理 ④ ( 异常处理 else 语句 | 异常处理 finally 语句 )

文章目录 一、Python 异常捕获 else 语句1、异常捕获 else 语句2、代码示例 - 没有触发 else 语句的情况3、代码示例 - 触发 else 语句的情况 二、Python 异常捕获 finally 语句1、异常捕获 finally 语句2、代码示例 - 出现异常后执行 finally 语句 一、Python 异常捕获 else 语…

展示和标注图像:探索Gradio AnnotatedImage模块的功能

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

代码生成器原理分析

代码生成器原理分析 理解代码生成器的需求和实现思路掌握freemaker的使用 理解数据库中的元数据完成环境搭建工作 浅谈代码生成器 概述 在项目开发过程中&#xff0c;关注点更多是在业务功能的开发及保证业务流程的正确性上&#xff0c;对于重复性的代码编写占据了程 序员…

指标综合评价(定性指标定量化、指标正相关化、赋权重)

目录 一、定性指标定量化 二、将指标同型化 线性比例变换法 极差变换法 二、评价指标赋予权重 三、综合评价 战斗机性能的综合评价问题 例&#xff1a;战斗机的性能指标主要包括最大速度、飞行半径、最大负载、隐身性能、垂直起降性能、可靠性、灵敏度等指标和相关费用。…