Spring Boot 整合 Apache Doris:实现海量数据实时OLAP分析实战

Spring Boot 整合 Apache Doris:实现海量数据实时OLAP分析实战

    • [一、Apache Doris 简介与核心优势](#一、Apache Doris 简介与核心优势)
      • [1.1 什么是 Apache Doris?](#1.1 什么是 Apache Doris?)
      • [1.2 Doris 架构概览(图1:Mermaid 流程图)](#1.2 Doris 架构概览(图1:Mermaid 流程图))
    • 二、整体技术架构设计
      • [2.1 全链路架构图(图2:Mermaid 彩色流程图)](#2.1 全链路架构图(图2:Mermaid 彩色流程图))
    • 三、环境准备与项目搭建
      • [3.1 启动 Doris 集群(推荐 Docker Compose)](#3.1 启动 Doris 集群(推荐 Docker Compose))
      • [3.2 创建 Spring Boot 工程(Maven)](#3.2 创建 Spring Boot 工程(Maven))
      • [3.3 application.yml 配置文件](#3.3 application.yml 配置文件)
    • 四、建表语句与数据模型设计
      • [4.1 在 Doris 中创建订单宽表](#4.1 在 Doris 中创建订单宽表)
    • [五、Spring Boot 写入数据到 Kafka](#五、Spring Boot 写入数据到 Kafka)
      • [5.1 定义实体类](#5.1 定义实体类)
      • [5.2 控制器接收请求](#5.2 控制器接收请求)
    • [六、Doris 配置 Routine Load 实现自动导入](#六、Doris 配置 Routine Load 实现自动导入)
    • [七、查询分析:Spring Boot 调用 Doris 执行 OLAP 查询](#七、查询分析:Spring Boot 调用 Doris 执行 OLAP 查询)
    • [八、性能优化策略(图3:优化路径 PlantUML)](#八、性能优化策略(图3:优化路径 PlantUML))
    • [九、监控与可观测性(图4:ASCII 架构 + 颜色标注)](#九、监控与可观测性(图4:ASCII 架构 + 颜色标注))
    • 十、常见问题与解决方案
    • 十一、总结
    • 十二、参考资料

在大数据时代,企业对数据分析的实时性、并发性和灵活性提出了前所未有的要求。传统关系型数据库(如 MySQL)难以应对高吞吐写入与复杂聚合查询的双重压力。为此,Apache Doris 作为一种高性能、低延迟的 MPP(Massively Parallel Processing)实时分析型数据库,正被越来越多企业用于构建现代化数仓系统。

本文将深入讲解如何通过 Spring Boot 框架整合 Apache Doris ,打造一套支持海量数据写入与秒级响应 OLAP 查询的完整架构,并提供可直接运行的 流程图代码(Mermaid 格式)原理图代码(PlantUML + ASCII 图形),所有图片均使用不同颜色区分模块功能,便于理解。


一、Apache Doris 简介与核心优势

1.1 什么是 Apache Doris?

Apache Doris 是一个开源的分布式 SQL 数据仓库,原名 Palo,由百度研发并捐赠给 Apache 基金会。它具备以下特性:

  • ✅ 支持标准 SQL(兼容 MySQL 协议)
  • ✅ 实时写入 + 实时查询(毫秒~秒级延迟)
  • ✅ 高并发点查和复杂分析能力
  • ✅ 架构简洁:仅 FE(Frontend)+ BE(Backend),无依赖 ZooKeeper/HDFS
  • ✅ 自动分区、物化视图优化性能

🎯 适用场景:用户行为分析、实时报表、日志分析、BI 大屏等。


1.2 Doris 架构概览(图1:Mermaid 流程图)

JDBC/MySQL协议
客户端/应用
FE: Frontend
SQL解析与计划生成
元数据管理
查询调度器
BE节点1
BE节点2
BE节点3
本地存储
本地存储
本地存储

🔍 图中颜色说明:

  • 橙色 (#f96):外部请求源(Spring Boot 应用)
  • 蓝色 (#6fb9e8):FE 节点 ------ 控制中枢
  • 青绿色 (#4db6ac):核心处理逻辑
  • 紫色 (#8d6eaa):元数据服务
  • 黄色 (#ffca28):任务分发器
  • 浅绿 (#a5d6a7):BE 存储节点(数据分片分布)

二、整体技术架构设计

我们设计一个典型的"生产 → 消费 → 分析"链路:

  1. 用户下单触发事件;
  2. Spring Boot 接收请求并发送至 Kafka;
  3. Doris 使用 Routine Load 自动消费 Kafka 数据;
  4. BI 系统通过 JDBC 查询 Doris 获取实时统计结果。

2.1 全链路架构图(图2:Mermaid 彩色流程图)

展示层
分析引擎
消息中间件
后端服务
前端系统
HTTP POST
JSON Event
Stream
SQL Query
Vue/React
【Spring Boot】
Kafka Cluster
【Apache Doris】
FE Node
BE Node
Grafana / BI Dashboard

🌈 颜色含义:

  • 红色系 (#ff7043):前端交互层
  • 蓝色系 (#29b6f6):Spring Boot 微服务
  • 橙黄 (#ffa726):Kafka 消息队列
  • 绿色系 (#66bb6a):Doris 分析引擎
  • 天蓝/深青:内部组件细化
  • 紫色 (#ab47bc):可视化展示终端

三、环境准备与项目搭建

3.1 启动 Doris 集群(推荐 Docker Compose)

yaml 复制代码
# docker-compose.yml
version: '3'
services:
  fe:
    image: apache/doris:fe-2.0.3
    ports:
      - "9030:9030"   # MySQL 协议连接
      - "8030:8030"   # RPC
    environment:
      - FE_CONFIG=meta_dir=/opt/doris/fe/meta
    volumes:
      - ./doris/fe:/opt/doris/fe

  be:
    image: apache/doris:be-2.0.3
    depends_on:
      - fe
    ports:
      - "9060:9060"
    environment:
      - BE_CONFIG=storage_root_path=/opt/doris/be/storage
    volumes:
      - ./doris/be:/opt/doris/be

启动命令:

bash 复制代码
docker-compose up -d

⚠️ 注意:首次启动需在 FE 初始化数据库和用户。


3.2 创建 Spring Boot 工程(Maven)

xml 复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.kafka</groupId>
        <artifactId>spring-kafka</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
</dependencies>

3.3 application.yml 配置文件

yaml 复制代码
server:
  port: 8080

spring:
  kafka:
    bootstrap-servers: localhost:9092
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
  datasource:
    url: jdbc:mysql://localhost:9030/demo_db?useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: 
    driver-class-name: com.mysql.cj.jdbc.Driver

四、建表语句与数据模型设计

4.1 在 Doris 中创建订单宽表

sql 复制代码
CREATE DATABASE IF NOT EXISTS demo_db;

USE demo_db;

CREATE TABLE IF NOT EXISTS order_wide (
    order_id BIGINT NOT NULL COMMENT "订单ID",
    user_id BIGINT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    category VARCHAR(100),
    price DECIMAL(10,2) NOT NULL,
    quantity INT NOT NULL,
    total_amount AS price * quantity STORED COMMENT "衍生字段",
    province VARCHAR(50),
    city VARCHAR(50),
    create_time DATETIME NOT NULL
)
ENGINE=OLAP
DUPLICATE KEY(order_id)
PARTITION BY RANGE(create_time)(
    PARTITION p202401 VALUES LESS THAN ("2024-02-01"),
    PARTITION p202402 VALUES LESS THAN ("2024-03-01")
)
DISTRIBUTED BY HASH(order_id) BUCKETS 10
PROPERTIES(
    "replication_num" = "1",
    "enable_persistent_index" = "true"
);

五、Spring Boot 写入数据到 Kafka

5.1 定义实体类

java 复制代码
public class OrderEvent {
    private Long orderId;
    private Long userId;
    private String productName;
    private String category;
    private BigDecimal price;
    private Integer quantity;
    private String province;
    private String city;
    // 构造函数、getter/setter 略...
}

5.2 控制器接收请求

java 复制代码
@RestController
@RequestMapping("/api/orders")
public class OrderController {

    @Autowired
    private KafkaTemplate<String, OrderEvent> kafkaTemplate;

    @PostMapping
    public ResponseEntity<String> create(@RequestBody OrderEvent event) {
        event.setCreateTime(LocalDateTime.now());
        kafkaTemplate.send("topic_doris_orders", event);
        return ResponseEntity.ok("Order sent to Kafka");
    }
}

六、Doris 配置 Routine Load 实现自动导入

sql 复制代码
CREATE ROUTINE LOAD demo_db.order_load_job ON order_wide
COLUMNS TERMINATED BY ",",
COLUMNS (order_id, user_id, product_name, category, price, quantity, province, city, create_time),
WHERE create_time IS NOT NULL
PROPERTIES
(
    "desired_concurrent_number"="3",
    "max_batch_interval" = "15",
    "max_error_number" = "1000",
    "strict_mode" = "false"
)
FROM KAFKA
(
    "kafka_broker_list" = "localhost:9092",
    "kafka_topic" = "topic_doris_orders",
    "kafka_partitions" = "0,1,2",
    "property.kafka_default_offsets" = "OFFSET_BEGINNING"
);

✅ 成功后可通过 SHOW ROUTINE LOAD 查看状态。


七、查询分析:Spring Boot 调用 Doris 执行 OLAP 查询

java 复制代码
@Service
public class ReportService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<Map<String, Object>> getRevenueByCategory() {
        String sql = """
            SELECT category, SUM(total_amount) AS revenue 
            FROM order_wide 
            WHERE create_time >= ?
            GROUP BY category 
            ORDER BY revenue DESC
            """;
        return jdbcTemplate.queryForList(sql, LocalDateTime.now().minusDays(7));
    }

    public long getTotalOrders() {
        return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM order_wide", Long.class);
    }
}

⚠️ 生产建议:高频查询使用缓存(Redis)或物化视图加速。


八、性能优化策略(图3:优化路径 PlantUML)

plantuml 复制代码
@startuml
skinparam backgroundColor #FEFEFE
skinparam sequenceArrowThickness 2
skinparam sequenceMessageAlign center

actor Developer as dev
database "MySQL Source" as mysql #lightblue
rectangle "Flink CDC" as flink #orange
queue "Kafka" as kafka #yellow
cloud "Doris" as doris #green
component "BI Tool" as bi #purple

dev -> mysql : 启用 Binlog
mysql -> flink : 实时捕获变更
flink -> kafka : 输出 JSON
kafka -> doris : Routine Load
doris -> bi : 提供 API 查询
bi -> dev : 展示报表

note right of doris
    <<优化点>>
    - 物化视图
    - 分区剪枝
    - 前缀索引
end note

@enduml

📌 此图为高级优化路径,适用于从 MySQL 实时同步至 Doris 的场景。


九、监控与可观测性(图4:ASCII 架构 + 颜色标注)

复制代码
┌─────────────────────────────────────────────────────┐
│                 Grafana 监控大屏                    │
│   ┌────────────┐  ┌────────────┐  ┌────────────┐     │
│   │ QPS 曲线   │  │ 导入延迟   │  │ 磁盘使用率 │     │
│   │ ████░░░    │  │ ██░░░░░    │  │ ██████░░ │     │
│   └────────────┘  └────────────┘  └────────────┘     │
└────────────┬───────────────────────────────┬────────┘
             │                               │
             ▼                               ▼
    ┌─────────────────┐           ┌────────────────────┐
    │   Prometheus    │◄─────────┤       Doris        │
    │ (指标采集)      │           │ [FE]:9030, [BE]:*  │
    └─────────────────┘           └────────────────────┘
             ▲                               ▲
             └──────────────┬────────────────┘
                            ▼
                   ┌────────────────────┐
                   │     Spring Boot    │
                   │  /metrics 暴露端点 │
                   └────────────────────┘

🎨 ASCII 图颜色模拟:

  • 红色边框:监控面板
  • 蓝色块:Prometheus 数据采集
  • 绿色背景:Doris 集群
  • 黄色图表:趋势可视化(用字符模拟)

十、常见问题与解决方案

问题 原因 解决方案
Routine Load 显示 PAUSED Kafka offset 超出范围 设置 "property.kafka_default_offsets" = "OFFSET_END"
查询超时 BE 资源不足 增加 BE 节点或调整 query_timeout
JDBC 连接失败 用户未授权 执行 GRANT SELECT ON TABLE xxx TO 'user'@'%'
数据未更新 物化视图未生效 检查 rollup 状态 SHOW ALTER TABLE ROLLUP

十一、总结

本文详细介绍了 Spring Boot 整合 Apache Doris 的全流程实践,涵盖:

✅ 架构设计

✅ 环境部署

✅ 数据建模

✅ 实时写入(Kafka + Routine Load)

✅ OLAP 查询

✅ 性能优化

✅ 可视化监控

并通过 Mermaid、PlantUML、ASCII 图形 提供了多张彩色原理图,帮助开发者快速掌握系统交互逻辑。

💡 建议进阶方向:

  • 结合 Flink CDC 实现 MySQL → Doris 实时入湖
  • 使用 Doris Manager 或 DevOps 脚本自动化运维
  • 引入 Kylin/Doris Bridge 支持多维分析

十二、参考资料

  1. Apache Doris 官网
  2. Spring for Apache Kafka
  3. Mermaid Live Editor: https://mermaid.live
  4. PlantUML Server: http://www.plantuml.com/plantuml
  5. GitHub 示例仓库:github.com/example/springboot-doris-demo

相关推荐
云启数智YQ17 小时前
深入解析云桌面:定义、主流方案与行业实践
大数据
档案宝档案管理17 小时前
权限分级+加密存储+操作追溯,筑牢会计档案安全防线
大数据·网络·人工智能·安全·档案·档案管理
源代码•宸17 小时前
Golang基础语法(go语言指针、go语言方法、go语言接口、go语言断言)
开发语言·经验分享·后端·golang·接口·指针·方法
Bony-17 小时前
Golang 常用工具
开发语言·后端·golang
pyniu17 小时前
Spring Boot车辆管理系统实战开发
java·spring boot·后端
love_summer17 小时前
深入理解Python控制流:从if-else到结构模式匹配,写出更优雅的条件判断逻辑
后端
牛奔17 小时前
GVM:Go 版本管理器安装与使用指南
开发语言·后端·golang
武子康17 小时前
大数据-207 如何应对多重共线性:使用线性回归中的最小二乘法时常见问题与解决方案
大数据·后端·机器学习