StarRocks实战——携程酒店实时数仓

news2024/9/27 9:23:05

目录

一、实时数仓

二、实时数仓架构介绍

2.1 Lambda架构

2.2 Kappa架构

三、携程酒店实时数仓架构

3.1 架构选型

3.2 实时计算引擎选型

3.3 OLAP选型

四、携程酒店实时订单

4.1 数据源

4.2 ETL数据处理

4.3 应用效果

4.4 总结

  原文大佬的这篇实时数仓建设案例有借鉴意义,属于数据治理范畴,这里直接摘抄下来用作学习和知识沉淀。

一、实时数仓

  当前,企业对于数据实时性的需求越来越迫切,因此需要实时数仓来满足这些需求。传统的离线数仓的数据时效性为T+1,并且调度频率以天为单位,无法支持实时场景的数据需求,即使将调度频率设置为小时,也仅能解决部分时效性要求低的场景,对于时效性要求较高的场景仍然无法优雅地支撑。因此,实时数据使用的问题必须得到有效解决。实时数仓主要用于解决传统数仓数据时效性较低的问题,通常会用实时的OLAP分析,实时数据看板、业务指标实时监控等场景。

二、实时数仓架构介绍

2.1 Lambda架构

  Lambda架构将数据分为实时数据和离线数据,并分别使用流式计算引擎(例如Flink 或者 SparkStreaming)和批量计算引擎(例如 Hive、Spark)对数据进行计算,然后,将计算结果存储在不同的存储引擎上,并对外提供数据服务。

2.2 Kappa架构

  Kappa架构将所有数据源的数据转换成流式数据,并将计算统一到流式计算引擎上,相比Lambda架构, Kappa 架构省去了离线数据流程,使得流程变得更加简单。Kappa 架构之所以流行,主要是因为kafka不仅可以作为消息队列使用,还可以保存更长时间的历史数据,以替代Lambda架构中的批处理层数据仓库。流处理引擎以更早的时间作为起点开始消费,起到了批处理的作用。

三、携程酒店实时数仓架构

3.1 架构选型

  采用的是Lambda+OLAP 变体架构。Lambda架构具有灵活性高、容错性高、成熟度高和迁移成本低的优点,但是实时数据和离线数据需要分别使用两套代码。

   OLAP变体架构:将实时计算中的聚合计算由OLAP引擎承担,从而减轻实时计算部分的聚合处理压力。这样做的优点是既可以满足数据分析师的实时自助分析需求,并且可以减轻计算引擎的处理压力,同时也减少了相应的开发和维护成本。缺点是对OLAP 引擎的数据写入性能和计算性能有更高的要求。

  3.2 实时计算引擎选型

     Flink具备Exactly-once的语义,轻量级checkpoint容错机制、低延迟、高吞吐和易用性高的特点。SparkStreaming 更适合微批处理。我们选择了使用 Flink。

3.3 OLAP选型

  我们选择 StarRocks 作为 OLAP 计算引擎。主要原因有3个:

  • StarRocks 是一种使用MPP分布式执行框架的数据库,集群查询性能强大;
  • StarRocks在高并发查询和多表关联等复杂多维分析场景中表现出色,并发能力强于clickhouse,而携程酒店的业务场景需要OLAP数据库支持每小时几万次的查询量;
  • StarRocks 提供了4种数据模型,可以更好的应对携程酒店的各种业务场景

四、携程酒店实时订单

4.1 数据源

    Mysql Binlog,通过携程自研平台 Muise接入生成 Kafka。

4.2 ETL数据处理

 问题一:如何保证消息处理的有序性?

    Muisev平台保证了Binlog消息的有序性,这里需要讨论的是ETL过程中如何保证消息的有序性。例如:一个酒店订单先在同一张表触发了两次更新操作,共计有了两条 Binlog 消息,消息1和消息2会先后进入流处理系统,如果这两个消息是在不同的Flink Task上进行处理,那么就有可能由于两个并发处理的速度不一致,先发生的消息后处理,导致最终输出的结果不对(出现乱序)

 上图是一个简化的过程,业务库流入到Kafka,Binlog 日志是顺序写入的,根据主键进行Hash分区 ,保证同一个主键的数据写入到kafka同一个分区。当Flink消费kafka时,需要设置合理的并发,保证同一个分区的数据由一个Task负责,另外尽量采取逻辑主键作为 Shuffle Key,从而保证了Flink内部的有序性。最后在写入StarRocks时,按照主键进行更新或删除操作,这样才能保证端到端的一致性。

 问题二:如何生产实时订单宽表?

   为了方便分析师和数据应用使用,我们需要生成明细订单宽表并存储在 StarRocks 上。酒店订单涉及的业务过程相对复杂,数据源来自多个数据流中,且由于酒店订单变化生命周期较长,客人可能会提前几个月甚至更久预订下单。这些都给生产实时订单宽表带来一定的困难。

   上图中生成订单宽表的sql逻辑在离线批处理场景下没有问题,但是实时场景下,这个sql会按照双流join的方式依次处理,每次只能处理一个join,所以上面代码有9个 Join 节点,Join节点会将左流的数据和右流的数据全部保存下来,最终会导致join过程中state状态存储膨胀了9倍。

   因此,我们采用了union all + group by的方式替代join;先用union all把数据错位拼接到一起,然后再最外层进行group by。这种方式相当于将 Join 关联转换成group by,不会放大 Flink的状态存储。

  还有一个问题,上面说过酒店订单的生命周期很长,用 union all 的方式,状态周期只保存了30分钟,一些订单的状态可能已经过期,当出现订单状态时,我们需要获取订单的历史状态,这样就需要一个中间层保存历史状态数据来做补充。历史数据我们选择存放在 Redis 中,第一次选择从离线数据导入,实时更新数据的同时,还更新 Redis和StarRocks。

 问题三:如何做数据校验?

   实时数据存在数据丢失或逻辑变更不及时的风险,为了保证数据的准确性,每日凌晨将实时数据和离线T-1数据做比对,如果数据校验不一致,会用离线数据更新StarRocks中对应的数据,并排查原因。

  整体流程见下图:

4.3 应用效果

  酒店实时订单表的数据量为十亿级,维表数据量有几百万,现已经在几十个数据看板和监控报表中使用,数据报表通常有二三十个维度和十几个数据指标,查询耗时99%约为3秒。

4.4 总结

   酒店实时数据具有量级大,生命周期长,业务流程多等复杂数据特征,携程酒店实时数仓选用 Lambda+OLAP 变体架构,借助 Starrocks 强大的计算性能,不仅降低了实时数仓开发成本,同时达到了支持实时的多维度数据统计、数据监控的效果,在实时库存监控以及应对紧急突发事件等项目获得了良好效果。

参考文章:

干货 | 携程酒店实时数仓架构和案例

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

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

相关文章

代码随想录-回溯算法

组合 //未剪枝 class Solution {List<List<Integer>> ans new ArrayList<>();Deque<Integer> path new LinkedList<>();public List<List<Integer>> combine(int n, int k) {backtracking(n, k, 1);return ans;}public void back…

js中浏览器渲染原理

JavaScript&#xff08;JS&#xff09;是一种广泛使用的编程语言&#xff0c;特别是在Web开发中。在浏览器中&#xff0c;JS被用于实现动态网页效果、交互性和用户体验的提升。然而&#xff0c;要理解JS在浏览器中的工作原理&#xff0c;我们首先需要了解浏览器的渲染过程。 浏…

C++之函数,指针

函数 1&#xff0c;函数概述 作用&#xff1a;将一段经常使用的代码封装起来&#xff0c;减少重复代码 一个较大的程序&#xff0c;一般分为若干份程序块&#xff0c;每个模块实现特定的功能 2&#xff0c;函数的定义 函数的定义一般有五个步骤&#xff1a; 1&#xff0c…

【前端素材】推荐优质数医院办公后台管理系统网页Stisla平台模板(附源码)

一、需求分析 在线后台管理系统是指供管理员或运营人员使用的Web应用程序&#xff0c;用于管理和监控网站、应用程序或系统的运行和数据。它通常包括一系列工具和功能&#xff0c;用于管理用户、内容、权限、数据等。下面是关于在线后台管理系统的详细分析&#xff1a; 1、功…

​用细节去解释,如何打造一款行政旗舰车型

高山行政加长版应该是这个级别里最大的几款 MPV 之一了&#xff0c;对于一款较大的车型&#xff0c;其最重要的是解决行驶的便利性。 这次我们就试试魏牌高山行政加长版&#xff0c;从产品本身出发看几个纬度的细节&#xff1a; 行政该如何定义加长后产品的功能变化加长之后到…

ssm172旅行社管理系统的设计与实现

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一 、设计说明 1.1 研究…

深入浅出Redis(零):Redis常用命令的使用

前言 Redis是一款基于键值对的数据结构存储系统&#xff0c;它的特点是基于内存操作、单线程处理命令、IO多路复用模型处理网络请求、键值对存储与简单丰富的数据结构等等 本篇文章作为深入浅出Redis&#xff08;一&#xff09;&#xff1a;对象与数据结构的基础篇&#xff0…

docker自定义镜像与上传

alpine制作jdk镜像 alpine Linux简介 1.Alpine Linux是一个轻型Linux发行版&#xff0c;它不同于通常的Linux发行版&#xff0c;Alpine采用了musl libc 和 BusyBox以减少系统的体积和运行时的资源消耗。 2.Alpine Linux提供了自己的包管理工具&#xff1a;apk(注意&#xff1a;…

修改docker默认存储位置【高版本的docker】

一、修改docker默认存储位置 1、停服务 systemctl stop docker 2、修改/etc/docker/daemon.json添加新的dcoker路径 如"data-root": "/mnt/hdd1/docker" 3、保存后重启服务&#xff1a;systemctl restart docker 二、其他服务的命令 systemctl disab…

4.1.CVAT——目标检测的标注详细步骤

文章目录 1. 进入任务1. 创建任务2. 已创建的task3. 进入标注界面 2. 选择标注类型2.1 选择标注类型2.2 进行标注2.3 遮挡 2.快捷键3.导出标注结果 1. 进入任务 登录后会看到如下图界面&#xff0c;CVAT的标注最小单位是Task&#xff0c;每个Task为一个标注任务。点击Task按钮…

python实现ElGamal算法

ElGamal公钥密码算法是在密码协议中有着重要应用的一类公钥密码算法&#xff0c;基于公钥密码体制和椭圆曲线加密体系&#xff0c;其安全性是基于有限域上离散对数学问题的难解性。至今仍是一个安全性良好的公钥密码算法。既可用于加密又可用于数字签名的公钥密码体制。 数字签…

浅谈人才招聘APP开发的解决方案

随着企业竞争加剧&#xff0c;高效、精准地招聘人才成为企业持续发展的关键。人才招聘系统能够简化招聘流程&#xff0c;提高效率&#xff0c;确保企业快速找到合适人才。同时&#xff0c;通过智能匹配和数据分析&#xff0c;提升招聘质量&#xff0c;优化候选人体验。因此&…

【Vue3】自定义 Vue3 插件(全局实现页面加载动画)

// main.ts import { createApp } from vue import App from ./App.vue import Loading from "./components/Loading/index.ts";const app createApp(App) type Lod {show: () > void,hide: () > void } //编写ts loading 声明文件放置报错 和 智能提示 decl…

腾讯云优惠券领取的三个渠道,一个比一个优惠!

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

MyBatis 学习(四)之 SQL 映射文件

目录 1 SQL 映射文件介绍 2 select 元素 3 insert 元素 4 update 和 delete 元素 5 sql 元素 6 parameterType 元素 7 resultType 元素 8 resultMap 元素&#xff08;重要&#xff09; 9 参考文档 1 SQL 映射文件介绍 映射器是 MyBatis 中最复杂并且是最重要的…

Vue开发实例(二)Vue代码运行及分析配置

Vue项目代码运行及分析 一、项目运行二、目录结构说明1、项目本身结构2、其他可能用到的文件夹 三、建议配置1、启动服务浏览器自动打开页面地址2、关闭eslint校验工具3、 src文件夹的别名的设置 一、项目运行 上篇文件末尾介绍到&#xff0c;进入项目&#xff0c;运行启动命令…

Unity(第二十二部)官方的反向动力学一般使用商城的IK插件,这个用的不多

反向动力学&#xff08;Inverse Kinematic&#xff0c;简称IK&#xff09;是一种通过子节点带动父节点运动的方法。 正向动力学 在骨骼动画中&#xff0c;大多数动画是通过将骨架中的关节角度旋转到预定值来生成的&#xff0c;子关节的位置根据父关节的旋转而改变&#xff0c;这…

【LeetCode】【滑动窗口长度不固定】978 最长湍流子数组

1794.【软件认证】最长的指定瑕疵度的元音子串 这个例题&#xff0c;是滑动窗口中长度不定求最大的题目&#xff0c;在看题之前可以先看一下【leetcode每日一题】【滑动窗口长度不固定】案例。 题目描述 定义&#xff1a;开头和结尾都是元音字母&#xff08;aeiouAEIOU&…

java基础-mysql

文章目录 mysql基础面试题什么是mysql什么是事务并发事务带来的影响事物的隔离级别索引大表优化什么是池化思想&#xff0c;什么是数据库连接池&#xff0c;为什么要用数据库连接池⾏锁&#xff0c;表锁&#xff1b;乐观锁&#xff0c;悲观锁MySQL主备同步的基本原理SQL什么情况…

2024年腾讯云优惠代金券领取入口汇总(新老用户免费领)

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…