基于 Apache Doris 构建数据仓库的方案和具体例子。Doris 以其高性能、易用性和实时能力,成为构建现代化数据仓库(特别是 OLAP 场景)的优秀选择。


一、为什么选择 Doris 构建数据仓库?

Doris(原名 Palo)是一个基于 MPP 架构的高性能、实分析型数据库,非常适合作为数据仓库(DW)和即席查询(Ad-hoc Query)的解决方案。

核心优势:

  1. 极高性能

    • 列式存储、向量化执行引擎、预聚合(物化视图)。

    • 支持高并发点查询,响应延迟可低至毫秒级。

  2. 简单易用

    • 兼容 MySQL 协议,使用标准 SQL,学习和使用成本极低。

    • 无需依赖 Hadoop 生态(HDFS/Hive/Spark)的繁重组件,架构简单,运维方便。

  3. 实时分析

    • 支持实时数据导入(如通过 Routine Load 消费 Kafka 数据),从数据产生到可查询可达秒级延迟。

  4. 统一化

    • 一个系统同时支持离线批量数据实时流式数据的导入与分析,避免了 Lambda 架构的复杂性。

  5. 联邦查询

    • 支持通过 ODBC/MySQL 外表功能查询其他数据源(如 MySQL, PostgreSQL, Elasticsearch, Hive 等),方便地整合现有数据。


二、典型数据仓库架构方案(基于 Doris)

二、典型数据仓库架构方案(基于 Doris)(文字描述版)

整个数据流向可以清晰地分为四个层级,数据从左向右流动:

数据源层 (Data Sources) -> 数据处理与导入层 (Data Ingestion) -> 数据存储与建模层 (Data Storage & Modeling) -> 数据应用层 (Data Application)

1. 数据源层 (Data Sources)

  • 业务数据库 (MySQL/PostgreSQL等): 通过 Change Data Capture (CDC) 工具(如 Canal, Debezium)实时捕获数据变更,并将变更日志推送到消息队列。

  • 应用日志/点击流: 通过日志收集工具(如 Logstash, Flume)或实时计算框架(如 Flink)进行初步处理后,写入消息队列。

  • 离线数据文件: 来自其他数据处理系统(如 Spark, Hive 作业)的批量数据文件,通常以列式格式(如 Parquet, ORC)存放在分布式文件系统(如 HDFS)或对象存储(如 S3)上。

2. 数据处理与导入层 (Data Ingestion)
这是 Doris 与数据源对接的关键环节,它提供了多种灵活的导入方式:

  • 对于实时数据流 (Kafka): 使用 Routine Load 功能。Doris 可以作为一个消费者,持续地从 Kafka 主题中拉取数据,并近乎实时地(秒级延迟)导入到内部表中。

  • 对于批量数据文件 (HDFS/S3): 使用 Broker Load 功能。Doris 通过部署的 Broker 节点,并行地读取远端存储上的大量数据文件,并高效地导入到内部表中。也可以使用 Spark-Doris-Connector 从 Spark 直接写入。

3. 数据存储与建模层 (Data Storage & Modeling in Doris)
这是 Doris 的核心,数据在这里被有序地组织和管理。

  • 采用经典的数仓分层思想:

    • 明细层 (DWD): 通常创建 Duplicate 明细表,存储最细粒度的原始数据,保留所有细节,用于全明细查询和回溯。

    • 汇总层 (DWS/ADS): 通常创建 Aggregate 或 Unique 表。更重要的是,可以利用 物化视图 (Materialized View) 在这一层对常用维度和指标进行预聚合,极大提升后续的查询性能。

  • 数据按照分区和分桶策略进行分布式存储,保证查询和导入的效率。

4. 数据应用层 (Data Application)
处理好的数据最终服务于上层应用:

  • BI 工具 (Tableau, Superset, FineBI): 这些工具通过标准的 MySQL 协议 直接连接到 Doris,执行查询并生成报表和仪表盘。

  • 即席查询 (Ad-hoc Query): 数据分析师和开发人员可以通过任何兼容 MySQL 的客户端(如 MySQL CLI, DBeaver, HeidiSQL)直接编写 SQL 进行探索式分析。

  • 数据服务 API: 后端应用程序可以通过 JDBC 或 HTTP 接口(如 Doris 的 RESTful API)来获取数据,为业务系统提供数据支持。


架构图(Mermaid 代码块)

为了更直观的理解,以下是上述架构的 Mermaid 流程图代码。您可以在支持 Mermaid 的编辑器(如 Typora、Obsidian、GitHub 等)中直接渲染查看:

架构图(纯文本示意图)

如果 Mermaid 仍然无法渲染,请参考以下纯文本描述的数据流图:

text

+------------------+      +-------------------------+      +-----------------------+
|   数据源层         |      |    数据处理与导入层       |      |  数据存储与建模层       |
|                  |      |                         |      |                       |
|  MySQL -> CDC -> | ---> | Kafka -> Routine Load ->| ---> |     Doris DWD层        |
|  日志 -> Flume ->| ---> |                         |      |                       |
|  HDFS -> Spark ->| ---> | HDFS -> Broker Load --->| ---> |     Doris DWS层        |
|                  |      |                         |      |   (物化视图加速)        |
+------------------+      +-------------------------+      +-----------------------+|v
+------------------+      +---------------------------------+      +-----------------------+
|   数据应用层      | <--- |         MySQL Protocol         | <--- |                       |
|                  |      |           JDBC / HTTP           |      |                       |
|   BI 工具        | <--- |                                 |      |                       |
|  即席查询        | <--- |                                 |      |                       |
|  数据API         | <--- |                                 |      |                       |
+------------------+      +---------------------------------+      +-----------------------+

各层说明:

  1. 数据源 (Data Sources):

    • 业务数据库: 如 MySQL、PostgreSQL,通过 CDC(Change Data Capture)工具(如 Canal, Debezium)将增量数据实时送入 Kafka。

    • 应用日志: 通过 Logstash、Flume 或 Flink 处理后写入 Kafka。

    • 离线文件: 来自其他系统(如 Spark/ Hive 作业)的 CSV、Parquet 文件,通常存放在 HDFS 或 S3 上。

  2. 数据处理与导入 (Data Ingestion):

    • 实时导入: 使用 Doris 的 Routine Load 功能,持续消费 Kafka 中的消息,实现实时数据接入。

    • 批量导入: 使用 Broker Load 或 Spark-Doris-Connector 将 HDFS/S3 上的大批量数据高效导入 Doris。

  3. 数据存储与建模 (Data Storage & Modeling in Doris):

    • 这是核心。Doris 内部采用 星型模型 或 雪花模型 来组织数据。

    • 明细层 (DWD): 创建 Duplicate 明细表,存储最细粒度的原始数据,用于全明细查询。

    • 汇总层 (DWS/ADS): 创建 Aggregate 或 Unique 表,或者利用物化视图(Materialized View)预聚合常用维度指标,极大提升查询性能。

  4. 数据应用 (Data Application):

    • BI 工具: 通过 MySQL 协议直接连接 Doris,进行可视化分析(Tableau, Superset, FineBI)。

    • 即席查询: 数据分析师使用标准 SQL 客户端直接查询 Doris。

    • 数据服务 API: 应用程序通过 JDBC 或 HTTP 接口(如 RESTful API)从 Doris 获取数据。


三、具体实现例子:电商数据仓库

我们以一个经典的电商场景为例,分析用户行为和订单数据。

步骤 1:创建数据库与表

首先,在 Doris 中创建数据库。

sql

CREATE DATABASE IF NOT EXISTS ecommerce_dw;
USE ecommerce_dw;

1. 创建明细表 (DWD 层):dwd_user_behavior
存储用户的所有行为数据(点击、加购、购买等)。

sql

CREATE TABLE IF NOT EXISTS dwd_user_behavior (`user_id` INT COMMENT '用户ID',`item_id` INT COMMENT '商品ID',`category_id` INT COMMENT '商品类目ID',`behavior_type` VARCHAR(20) COMMENT '行为类型: pv, buy, cart, fav',`timestamp` BIGINT COMMENT '行为发生的时间戳',`dt` DATE COMMENT '基于timestamp生成的日期, 用于分区'
) ENGINE=OLAP
DUPLICATE KEY(`user_id`, `item_id`, `timestamp`) -- 明细数据,用Duplicate模型
PARTITION BY RANGE(`dt`) () -- 按天分区
DISTRIBUTED BY HASH(`user_id`) BUCKETS 10
PROPERTIES ("replication_num" = "3"
);

2. 创建汇总表 (DWS 层):dws_user_behavior_daily
按用户和天预聚合常用指标。

sql

CREATE TABLE IF NOT EXISTS dws_user_behavior_daily (`user_id` INT COMMENT '用户ID',`dt` DATE COMMENT '日期',`pv_count` BIGINT SUM DEFAULT "0" COMMENT '当日总点击数',`buy_count` BIGINT SUM DEFAULT "0" COMMENT '当日总购买次数',`cart_count` BIGINT SUM DEFAULT "0" COMMENT '当日加购次数',`fav_count` BIGINT SUM DEFAULT "0" COMMENT '当日收藏次数',`last_visit_time` DATETIME REPLACE COMMENT '最后访问时间'
) ENGINE=OLAP
AGGREGATE KEY(`user_id`, `dt`) -- 汇总数据,用Aggregate模型
DISTRIBUTED BY HASH(`user_id`) BUCKETS 10
PROPERTIES ("replication_num" = "3"
);

注意:也可以使用物化视图(Materialized View)在明细表上自动维护汇总数据,无需手动创建和更新此表。

步骤 2:数据导入

实时导入用户行为数据(从 Kafka):

假设用户行为日志已经写入 Kafka 的 user_behavior_topic

sql

CREATE ROUTINE LOAD ecommerce_dw.user_behavior_kafka_load ON dwd_user_behavior
COLUMNS(user_id, item_id, category_id, behavior_type, timestamp, dt=from_unixtime(timestamp, '%Y%m%d')),
ROUTINE LOAD PROPERTIES
("desired_concurrent_number" = "5","max_error_number" = "1000"
)
FROM KAFKA
("kafka_broker_list" = "kafka-host01:9092,kafka-host02:9092","kafka_topic" = "user_behavior_topic","property.group.id" = "doris-dw","property.security.protocol" = "SASL_PLAINTEXT",-- ... 其他Kafka认证配置
);

批量导入历史订单数据(从 HDFS):

sql

LOAD LABEL ecommerce_dw.hdfs_order_load_20231027
(DATA INFILE("hdfs://namenode:8020/path/to/orders/*.parquet")INTO TABLE `dwd_orders` -- 假设有订单明细表FORMAT AS "parquet"
)
WITH BROKER "broker_name"
("username" = "hdfs_user","password" = "hdfs_password"
)
PROPERTIES
("timeout" = "3600"
);
步骤 3:数据建模与查询

1. 明细查询 (DWD)
查询某个用户的所有原始行为记录。

sql

SELECT * FROM dwd_user_behavior 
WHERE user_id = 123456 AND dt = '2023-10-27' 
ORDER BY timestamp DESC 
LIMIT 100;

2. 汇总分析 (DWS)
基于汇总表,查询每日最活跃的 Top 10 用户,性能极快。

sql

SELECT user_id, dt, pv_count
FROM dws_user_behavior_daily
ORDER BY pv_count DESC
LIMIT 10;

3. 复杂分析
即使没有预聚合,直接查询明细表,Doris 也能提供不错的性能。例如,分析购买转化率(漏斗分析):

sql

SELECTdt,COUNT(DISTINCT user_id) AS total_uv,COUNT(DISTINCT IF(behavior_type = 'buy', user_id, NULL)) AS buy_uv,COUNT(DISTINCT IF(behavior_type = 'buy', user_id, NULL)) / COUNT(DISTINCT user_id) AS conversion_rate
FROM dwd_user_behavior
WHERE dt >= '2023-10-20'
GROUP BY dt
ORDER BY dt;
步骤 4:使用物化视图(Materialized View)加速

为 dwd_user_behavior 表创建一个按 category_id 预聚合的物化视图,加速类目分析查询。

sql

-- 创建物化视图
CREATE MATERIALIZED VIEW category_behavior_mv AS
SELECTcategory_id,dt,COUNT(*) AS pv,COUNT(DISTINCT user_id) AS uv,SUM(IF(behavior_type = 'buy', 1, 0)) AS buy_count
FROM dwd_user_behavior
GROUP BY category_id, dt;-- 查询会自动路由到物化视图,速度极快
SELECT category_id, SUM(pv) AS total_pv
FROM dwd_user_behavior
WHERE dt BETWEEN '2023-10-01' AND '2023-10-31'
GROUP BY category_id
ORDER BY total_pv DESC
LIMIT 10;

Doris 的查询优化器会自动判断是否可以使用物化视图来加速查询,对用户透明。


四、最佳实践与建议

  1. 数据模型设计

    • 谨慎选择分区键(PARTITION BY)和分桶键(DISTRIBUTED BY)。分区用于管理,分桶用于并行。

    • 小表(如维度表)可使用 Unique 模型,大事实表根据场景选择 Duplicate 或 Aggregate 模型。

  2. 物化视图策略

    • 为最常用且耗时的分组聚合查询创建物化视图。

    • 物化视图是空间换时间的策略,不宜过多,优先考虑公共和高频查询。

  3. 资源与监控

    • 合理设置 replication_num(通常 3 副本保证高可用)。

    • 监控 FE/BE 节点的 CPU、内存、磁盘使用情况,以及导入任务的延迟和错误率。

  4. 数据生命周期管理

    • 使用 PARTITION 功能,结合动态分区特性,自动创建新分区和删除旧分区(ALTER TABLE ... SET ("dynamic_partition.enable" = "true")),实现数据滚动更新。

总结

Apache Doris 提供了一个 简单、高性能、实时统一 的数据仓库解决方案。通过将实时流和批量数据高效导入,并利用其内置的聚合模型和物化视图等特性,可以轻松构建从明细层到汇总层的数据体系,支撑企业级的高并发即席查询和复杂的多维分析需求,极大地简化了传统大数据架构的复杂度。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebRTC进阶--WebRTC错误Failed to unprotect SRTP packet, err=9

文章目录 原因分析 SRTP Anti-Replay 机制 客户端源码 err=9 的定义: 为什么会触发 replay_fail ✅ 解决方向 原因分析 SRTP Anti-Replay 机制 SRTP 收包时会用一个 Replay Window(64/128个序列号大小)检查 seq 是否合理。 如果你构造的恢复包 recover_seq 比当前接收窗口…

Web服务与Nginx详解

文章目录前言一、Web 概念1.1 Web 的基本概念1.1.1 特点1.2 B/S 架构模型1.3 Web 请求与响应过程1.4 静态资源与动态资源1.5 Web 的发展阶段1.6 实验&#xff1a;搭建最小 Web 服务1.6.1 实验目标1.6.2 实验步骤1.7 小结二、HTTP 与 HTTPS 协议2.1 HTTP 与 HTTPS 的区别2.2 HTT…

CC-Link IE FB 转 DeviceNet 实现欧姆龙 PLC 与松下机器人在 SMT 生产线锡膏印刷环节的精准定位控制

案例背景在电子制造行业&#xff0c;SMT&#xff08;表面贴装技术&#xff09;生产线对设备的精准控制要求极高。某电子制造企业的 SMT 生产线中&#xff0c;锡膏印刷机、SPI&#xff08;锡膏厚度检测仪&#xff09;等前段设备采用了基于 CC-Link IE FB 主站的欧姆龙 NJ 系列 P…

IP5326_BZ 支持C同口输入输出的移动电源芯片 2.4A的充放电电流 支持4LED指示灯

IP5326 是一款集成升压转换器、锂电池充电管理、电池电量指示的多功能电源管理 SOC&#xff0c;为移动电源提供完整的电源解决方案。得益于 IP5326 的高集成度与丰富功能,使其在应用时仅需极少的外围器件&#xff0c;并有效减小整体方案的尺寸&#xff0c;降低 BOM 成本。IP532…

若依基础学习

若依基础学习 1.修改数据库密码以及连接名&#xff1a; RuoYi-Vue-master\ruoyi-admin\src\main\resources\application-druid.yml2.各个文件作用&#xff1a; ruoyi-admin (主启动)├── ruoyi-framework (框架核心)│ ├── ruoyi-common (通用工具)│ └── ruoyi-sy…

靶向肽Dcpep

名称&#xff1a;靶向肽Dcpep三字母序列&#xff1a;NH2-Phe-Tyr-Pro-Ser-Tyr-His-Ser-Thr-Pro-Gln-Arg-Pro-OH单字母序列&#xff1a;NH2-FYPSYHSTPQRP-OH分子式&#xff1a;C69H94N18O19分子量&#xff1a;1479.62备注&#xff1a;仅供科研&#xff0c;不用于人体简述&#x…

华为在国内搞的研发基地有多野?标杆游学带你解锁“研发界顶流”

宝子们&#xff01;原来华为在国内有这么多“宝藏研发基地”&#xff0c;之前总觉得遥不可及走进深圳坂田总部——1.3平方公里的园区&#xff0c;走进去就像进了“科技版大观园”&#xff0c;21层研发主楼看着就很有气势&#xff0c;天鹅湖边的路全用科学家名字命名&#xff0c…

linux缺页中断频繁怎么定位

1,怎么看内存是否有缺页中断 查看日志: dmesg | grep “do fault” perf record -e page-faults -g -p <PID> 系统级监控: 使用 vmstat 查看全局缺页中断(si/so 表示换入/换出页数) vmstat 1 # 每秒刷新,观察 si/so 列 iostat显示磁盘使用情况,举例iostat -x …

06-Hadoop生态系统组件(2)

4. 数据查询组件 4.1 Apache Hive详解 from typing import Dict, List, Any, Optional, Tuple, Union from dataclasses import dataclass from enum import Enum from datetime import datetime import re import jsonclass HiveTableType(Enum):"""Hive表类型…

【自动化实战】Python操作Excel/WORD/PDF:openpyxl与docx库详解

在现代办公环境中&#xff0c;我们经常需要处理各种文档格式&#xff0c;如Excel表格、Word文档和PDF文件。手动处理这些文档不仅耗时&#xff0c;而且容易出错。Python提供了多个强大的库来实现文档处理的自动化&#xff0c;本文将重点介绍如何使用openpyxl和docx库来操作Exce…

构建安全的自动驾驶:软件测试中的编码规范与AI验证

自动驾驶不再只是未来想象&#xff0c;它正在以惊人的速度走向现实。但这一变革也带来了软件开发的全新命题。与传统车辆不同&#xff0c;自动驾驶依赖复杂的AI模型、传感系统和车载决策单元&#xff0c;必须应对更多现实环境的不确定性。在强监管、高风险、快节奏的背景下&…

2025高教社数学建模国赛C题 - NIPT的时点选择与胎儿的异常判定(完整参考论文)

基于机器学习与统计模型的NIPT检测优化与异常判定问题研究 摘要 非侵入性产前检测(NIPT)作为一种无创安全的胎儿染色体异常筛查技术,在现代产前医疗中发挥着重要作用,其准确性与检测时机及异常判定的科学性直接影响临床决策。然而,男胎Y染色体浓度受孕周数、孕妇BMI等多…

一种基于注解与AOP的Spring Boot接口限流防刷方案

1. 添加Maven依赖<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupI…

代码随想录二刷之“贪心算法”~GO

简单题目 1.455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; func findContentChildren(g []int, s []int) int {sort.Ints(g)sort.Ints(s)index : 0for i : 0;i<len(s);i{if index < len(g) && g[index] < s[i]{index}}return index }感悟&#xff…

Pod自动重启问题排查:JDK 17 EA版本G1GC Bug导致的应用崩溃

Pod自动重启问题排查:JDK 17 EA版本G1GC Bug导致的应用崩溃 问题背景 在生产环境中,我们遇到了一个严重的稳定性问题:应用Pod频繁自动重启,导致服务不稳定。通过深入分析JVM崩溃日志,最终定位到是JDK 17 EA版本中G1GC的一个已知Bug导致的。 问题现象 1. Pod重启表现 应…

HTML文本格式化标签

HTML提供了多种标签用于文本的格式化&#xff0c;这些标签可以改变文本的外观&#xff08;如粗细、斜体&#xff09;或赋予文本特定的含义&#xff08;如强调、引用&#xff09;。1. 基本文本样式标签&#xff08;1&#xff09;粗体文本使用<b>或<strong>标签可以使…

数据结构之单链表和环形链表的应用(二)-

目录一、相交链表二、环形链表I三、环形链表II总结一、相交链表 相交链表 首先理解什么是链表相交&#xff0c;相交即存在共用的节点&#xff0c;链表相交有三种情况&#xff0c; 中间位置相交头部就开始相交尾部相交 如图pcurA和pcurB就都有一个next指针指向同一个节点 这…

属性关键字

属性关键字深拷贝与浅拷贝类型各类对象深浅拷贝判断完全深拷贝的实现属性关键字property、synthesize和dynamic原子操作读写权限内存管理strong &#x1f19a; copy总结深拷贝与浅拷贝 先前学习OC时已经对深浅拷贝进行了一次学习&#xff0c;这里进行一个复习总结和补充&#…

突发奇想,还未实践,在Vben5的Antd模式下,将表单从「JS 配置化」改写成「模板可视化」形式(豆包版)

在 Vben5 的 Antd 模式下&#xff0c;完全可以将表单从「JS 配置化」改写成「模板可视化」形式&#xff0c;把表单项直接写在 Vue 模板中&#xff0c;更直观且符合传统 Vue 开发习惯。以下是完整的改写示例&#xff0c;保留原功能但结构更清晰&#xff1a; 改写思路 放弃 JS 中…

【更新完毕】2025数学建模国赛E题思路代码文章高教社杯全国大学生数学建模-AI 辅助智能体测

全部更新完毕 包含完整的文章全部问题的代码、结果、图表 完整内容请看文末最后的推广群基于AI姿态识别的立定跳远运动分析与个性化训练优化研究 随着《国家学生体质健康标准》的颁布实施&#xff0c;通过AI技术辅助体育运动分析已成为提升学生体质健康水平的重要手段。本研究针…