基于Doris构建实时数仓:架构设计与最佳实践

news2026/3/22 9:36:38
基于Doris构建实时数仓架构设计与最佳实践关键词实时数仓、Doris数据库、MPP架构、实时数据摄入、查询优化摘要本文从电商大促场景下的实时数据需求出发系统讲解基于Doris构建实时数仓的核心逻辑。通过“故事引入-概念拆解-架构设计-实战落地”的递进式讲解结合具体代码示例和最佳实践帮助读者掌握Doris在实时数仓中的关键应用技巧解决传统数仓延迟高、实时性差的痛点。背景介绍目的和范围在直播电商、秒杀活动等场景下企业需要实时掌握GMV、用户点击、库存变化等数据比如双11需要每秒更新战报。传统数仓依赖T1批量处理无法满足秒级甚至毫秒级的实时分析需求。本文聚焦“如何用Doris构建实时数仓”覆盖架构设计、数据链路搭建、性能优化等核心环节适用于从0到1搭建实时数仓的企业。预期读者数据工程师负责实时数仓落地数据架构师规划数据中台技术选型业务分析师需要理解实时数据的技术实现文档结构概述本文从“为什么需要实时数仓”入手用电商案例引出Doris的优势拆解Doris核心概念MPP、实时更新等详解“数据摄入→存储→查询”全链路架构设计通过FlinkDoris实战代码演示数据写入最后总结最佳实践和常见问题。术语表术语解释实时数仓支持秒级/毫秒级数据更新与查询的数据库系统区别于传统T1批量处理数仓MPP大规模并行处理Massive Parallel Processing多节点协同处理查询向量化执行数据库按列批量处理数据而非逐条处理提升查询效率分桶Bucket将数据按哈希值分散到不同存储单元提升并发读取能力核心概念与联系故事引入双11的“数据生死战”2023年双11某电商公司遇到大问题凌晨1点的秒杀活动中传统数仓的GMV统计延迟了20分钟——当主播喊出“销量破亿”时后台系统还显示8000万导致运营策略调整滞后。技术团队紧急调研发现传统数仓依赖Hive的批量ETL每天凌晨跑一次而实时数据如Kafka中的订单流无法快速写入分析库。最终他们选择Doris作为实时数仓核心实现了“订单产生→数据入库→报表更新”的3秒闭环当年双11战报刷新频率从分钟级提升到秒级。核心概念解释像给小学生讲故事核心概念一实时数仓想象你有一个“魔法账本”每花1块钱账本立刻显示最新余额。实时数仓就像这个魔法账本——企业的每一笔订单、每一次点击都会立刻被记录并且能马上查询到最新的统计结果比如“过去10分钟卖了多少件衣服”。核心概念二Doris数据库Doris是一个“超级数据管家”它有两个超能力快采用MPP架构像多个小朋友一起拼拼图每人负责一块能同时用多个服务器处理查询实时传统数据库如MySQL写入后需要等待“整理时间”才能查询Doris支持“边写边读”新数据写入后立刻能被查到。核心概念三数据链路数据链路是“数据的快递路线”。比如用户下单→数据先到Kafka快递中转站暂存数据→Flink快递员清洗/加工数据→Doris快递终点存储并提供查询。这条路线的每一步都要“快而准”否则实时数仓就会“堵车”。核心概念之间的关系用小学生能理解的比喻实时数仓像一个“实时奶茶店”Doris是“奶茶柜”存储和展示奶茶支持快速拿取查询和快速补货写入数据链路是“奶茶制作流水线”Kafka是“等待区”暂存订单Flink是“制作台”把原料变成奶茶最终把奶茶放到Doris的柜子里三者配合才能让顾客业务人员立刻喝到新鲜奶茶看到实时数据。核心概念原理和架构的文本示意图实时数仓核心架构可总结为“三流一体”数据流业务系统→Kafka→Flink→Doris查询流业务查询→Doris查询引擎→返回结果控制流监控如Prometheus→调整资源如扩缩容→优化链路Mermaid 流程图产生新业务数据Kafka消息队列Flink实时计算Doris实时数仓BI工具/业务系统业务决策核心算法原理 具体操作步骤Doris的“快”和“实时”背后有两大核心技术MPP并行计算和向量化执行引擎。MPP并行计算原理示例MPP就像“分蛋糕”一个10寸蛋糕大查询如果只有1个人吃单节点处理需要很久如果分给10个人10个节点每人吃1寸很快就能吃完。Doris的MPP架构会自动将查询拆分成多个子任务分发到不同节点并行执行最后合并结果。例如查询“过去1小时所有订单的总金额”Doris会让每个节点计算自己存储的那部分订单金额再把结果相加。向量化执行引擎原理代码类比传统数据库是“逐条处理数据”像逐个检查快递包裹向量化执行是“批量处理”像一次搬10个包裹。Doris的向量化引擎将数据按列存储如所有订单的“金额”列单独存查询时直接对整列数据做计算如求和、平均值效率提升10倍以上。用Python类比# 传统逐条处理慢total0fororderinorders:totalorder.amount# 向量化批量处理快importnumpyasnp amountsnp.array([order.amountfororderinorders])totalamounts.sum()# 底层批量计算速度更快数学模型和公式 详细讲解 举例说明Doris的存储模型可简化为“分区分桶索引加速”用数学公式表示查询时间T 查询 T 扫描 T 计算 T 合并 T_{查询} T_{扫描} T_{计算} T_{合并}T查询​T扫描​T计算​T合并​其中( T_{扫描} )从磁盘读取数据的时间分桶优化可减少扫描数据量( T_{计算} )执行聚合/过滤的时间向量化执行降低( T_{计算} )( T_{合并} )各节点结果合并的时间MPP并行降低( T_{合并} )。举例查询“2024年3月北京地区的订单金额”。分区按时间分区如按月直接定位到“2024年3月”分区无需扫描其他月份数据分桶按“地区”分桶北京地区的数据集中在少数桶扫描量减少索引对“地区”列建立索引快速定位北京的数据行。最终( T_{扫描} )从扫描全表100GB降到扫描分区分桶1GB查询时间从10秒降到0.5秒。项目实战代码实际案例和详细解释说明开发环境搭建所需组件Doris集群3节点配置16核32G500G SSDKafka集群3节点用于缓冲实时订单数据Flink集群2节点用于数据清洗监控工具PrometheusGrafana监控Doris的QPS、延迟步骤1部署Doris参考官方文档Doris部署指南安装FE前端节点负责查询调度和BE后端节点负责存储计算。步骤2启动Kafka# 启动ZooKeeperKafka依赖bin/zookeeper-server-start.sh config/zookeeper.properties# 启动Kafka Brokerbin/kafka-server-start.sh config/server.properties# 创建订单主题topicbin/kafka-topics.sh--create--topicorder_topic --bootstrap-server localhost:9092--partitions3--replication-factor2源代码详细实现和代码解读我们需要实现“Kafka→Flink→Doris”的数据链路将实时订单数据写入Doris。以下是关键代码Step 1在Doris中创建订单表选择Doris的Unique表模型支持主键去重适合订单数据CREATETABLEIFNOTEXISTSrealtime_order(order_idBIGINTCOMMENT订单ID主键,user_idINTCOMMENT用户ID,amountDECIMAL(10,2)COMMENT订单金额,regionVARCHAR(20)COMMENT地区,create_timeDATETIMECOMMENT订单时间)UNIQUEKEY(order_id)-- 主键保证数据唯一性DISTRIBUTEDBYHASH(region)BUCKETS6-- 按地区分桶6个桶PROPERTIES(replication_num3,-- 副本数3保证高可用dynamic_partition.enabletrue,-- 动态分区按天自动创建分区dynamic_partition.time_unitDAY,dynamic_partition.start-30,-- 保留最近30天数据dynamic_partition.end1);Step 2Flink读取Kafka数据并写入Doris使用Flink的Doris连接器doris-connector-flink代码如下publicclassKafka2Doris{publicstaticvoidmain(String[]args)throwsException{StreamExecutionEnvironmentenvStreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(3);// 并行度3匹配Kafka的3个分区// 读取Kafka订单数据JSON格式DataStreamSourceStringkafkaStreamenv.addSource(KafkaSource.Stringbuilder().setBootstrapServers(kafka01:9092,kafka02:9092).setTopics(order_topic).setGroupId(flink-consumer-group).setStartingOffsets(OffsetsInitializer.earliest()).setValueOnlyDeserializer(newSimpleStringSchema()).build());// 解析JSON转换为Order对象DataStreamOrderorderStreamkafkaStream.map(json-{// 使用Jackson解析JSON示例代码实际需处理异常ObjectMappermappernewObjectMapper();returnmapper.readValue(json,Order.class);});// 写入Doris配置DorisSinkOptionsoptionsDorisSinkOptions.builder().setFenodes(doris-fe01:8030,doris-fe02:8030)// Doris FE节点地址.setTableIdentifier(realtime_order)// 表名.setDatabase(realtime_db)// 数据库名.setUsername(admin).setPassword(password).build();// 使用Doris连接器写入orderStream.sinkTo(DorisSink.sink(options,DorisExecutionOptions.builder().setBatchSize(1000)// 每批1000条.setBatchIntervalMs(5000)// 每5秒提交一次.build(),newDorisDynamicTableSink.DorisRowDataConverter()));env.execute(Kafka to Doris Real-time Ingestion);}}// Order实体类简化classOrder{privateLongorder_id;privateIntegeruser_id;privateDoubleamount;privateStringregion;privateStringcreate_time;// getter/setter省略}代码解读与分析Kafka读取Flink通过Kafka Source读取实时订单数据并行度设置为3与Kafka分区数一致避免数据倾斜数据清洗将JSON字符串解析为Java对象实际项目中可能需要补充数据校验、过滤无效数据等逻辑Doris写入使用Doris官方连接器配置批量写入每批1000条5秒提交平衡写入延迟和吞吐量表模型选择Unique表模型通过order_id主键保证数据唯一性避免重复写入适合订单等需要去重的场景。实际应用场景基于Doris的实时数仓已在以下场景广泛应用电商实时GMV监控每笔订单写入Doris后BI工具如Tableau秒级更新GMV趋势图支持运营实时调整策略用户行为分析追踪用户点击、加购、下单等行为实时计算“转化率”优化页面设计库存实时预警结合订单数据和库存系统当某商品库存低于阈值时立即触发补货提醒广告效果实时评估统计广告点击→下单的转化路径实时调整广告投放策略。工具和资源推荐类型工具/资源说明官方文档Doris官方文档包含安装、配置、SQL语法等详细指南连接器doris-connector-flinkFlink写入Doris的官方连接器支持高并发写入监控Doris-exporterPrometheus exporter监控Doris的QPS、延迟、节点状态等指标社区Apache Doris社区参与技术讨论获取最新特性和Bug修复如Slack、邮件列表案例《Doris实战白皮书》企业级实时数仓落地案例包含性能调优、故障排查经验未来发展趋势与挑战趋势1云原生实时数仓Doris正在向云原生架构演进如支持K8s部署、弹性扩缩容未来企业无需自己维护集群可通过云服务如阿里云Doris、AWS托管服务快速搭建实时数仓。趋势2实时计算与存储融合传统架构中Flink负责计算、Doris负责存储未来可能出现“存储即计算”的融合架构如Doris内置简单实时计算逻辑进一步降低数据链路延迟。挑战1数据一致性保障在高并发写入场景下如双11每秒10万条订单如何保证Doris中数据的一致性如订单和支付数据的关联是关键挑战需要结合事务特性Doris正在支持分布式事务和业务逻辑设计。挑战2资源动态调优实时数仓的查询负载波动大如大促期间QPS是平时的10倍需要自动调优资源如动态调整分桶数、查询并发度这依赖更智能的查询优化器。总结学到了什么核心概念回顾实时数仓支持秒级数据更新与查询的“魔法账本”Doris基于MPP架构的实时分析数据库擅长“快”和“实时”数据链路业务数据→Kafka缓冲→Flink清洗→Doris存储→业务查询的完整流程。概念关系回顾Doris是实时数仓的“核心存储引擎”与Kafka缓冲、Flink计算配合形成“实时数据闭环”。MPP架构和向量化执行是Doris“快”的关键分区分桶设计是优化查询的核心手段。思考题动动小脑筋假设你负责一个外卖平台的实时数仓需要实时统计“过去30分钟各区域的订单量”你会如何设计Doris的表结构分区、分桶、表模型如果双11期间Doris的查询延迟突然升高从500ms升到5秒你会从哪些方面排查问题提示可以从数据量、查询语句、集群资源等角度思考附录常见问题与解答Q1Doris支持事务吗ADoris 1.2版本开始支持分布式事务2PC协议适合需要“原子性写入”的场景如订单和库存的关联更新。Q2数据写入Doris后多久能被查询到ADoris支持“实时可见”数据写入后立即可以被查询基于其“版本化存储”机制新数据会生成新版本查询时自动读取最新版本。Q3如何监控Doris的性能A推荐使用Doris-exporterPrometheus exporter采集指标关注query_time查询时间、scan_rows扫描行数、be_mem_usageBE节点内存使用率等关键指标。Q4Doris适合存储多大量级的数据A单集群支持EB级数据通过横向扩展BE节点典型企业场景如每天10亿条数据可轻松应对。扩展阅读 参考资料Apache Doris官方文档https://doris.apache.org/《实时数据仓库构建与实践》机械工业出版社Flink Doris连接器源码https://github.com/apache/doris-flink-connector阿里云Doris最佳实践https://help.aliyun.com/document_detail/255912.html

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…