Apache Doris 冷热分层、行列混存、数据导入导出与物化视图实战操作

 更新时间:2026年11月02日 10:19:10   作者:向阳ya  
Apache Doris作为新一代实时数据仓库,在生产环境中需平衡查询性能、存储成本与数据时效性,本文基于最新稳定版本,系统梳理冷热分层存储、行列混存架构、多模式数据导入导出及物化视图优化四大核心实战能力,旨在提供可落地的工程最佳实践,感兴趣的朋友一起看看吧

一、写在前面

本文整理了一套 Apache Doris 的实战操作笔记,覆盖日常数仓开发中最常用的几类能力:远程存储与冷热分层、行列混存、多种数据导入方式、数据导出方式,以及普通视图与物化视图的使用。所有示例均基于同一套环境,可直接对照执行。

示例环境约定如下:

  • FE 节点:master:9030(MySQL 协议端口)
  • BE 节点 HTTP 端口:master:8034
  • HDFS:hdfs://master:9000,用户 root
  • 数据库:bigdata

提示:文中涉及账号密码仅为本地测试环境示例,生产环境请使用最小权限账号并妥善保管凭据。

二、远程存储与冷热分层

2.1 创建远程存储资源

Doris 支持将冷数据下沉到 HDFS、S3 等远端存储。第一步是创建一个 RESOURCE,描述远端存储的连接信息。

CREATE RESOURCE "remote_hdfs" PROPERTIES (
    "type" = "hdfs",
    "fs.defaultFS" = "master:9000",
    "hadoop.username" = "root",
    "hadoop.password" = "root",
    "root_path" = "/data/doris"
);

关键参数说明:

参数说明
type远端存储类型,如 hdfs、s3
fs.defaultFSHDFS 的 NameNode 地址
hadoop.username访问 HDFS 的用户名
root_path冷数据在远端存储上的根目录

2.2 创建存储策略

存储策略把「资源」和「冷却时间」绑定起来,cooldown_ttl 表示数据写入后多久开始下沉到远端存储。

CREATE STORAGE POLICY test_policy PROPERTIES (
    "storage_resource" = "remote_hdfs",
    "cooldown_ttl" = "300"
);

这里的 300 单位为秒,即数据写入 5 分钟后进入冷却状态,由后台线程迁移到 HDFS。

2.3 建表时直接绑定存储策略

CREATE TABLE IF NOT EXISTS create_table_use_created_policy (
    k1 BIGINT,
    k2 LARGEINT,
    v1 VARCHAR(2048)
)
UNIQUE KEY(k1)
DISTRIBUTED BY HASH (k1) BUCKETS 3
PROPERTIES(
    "enable_unique_key_merge_on_write" = "false",
    "storage_policy" = "test_policy",
    "replication_num" = "1"
);

建表后可以查看分区信息,确认策略是否生效:

SHOW PARTITIONS FROM create_table_use_created_policy \G;

插入一条数据验证写入链路:

INSERT INTO create_table_use_created_policy VALUES (1, 1, '123');

2.4 存量表接入冷热分层

对于已经存在的表,无需重建,直接通过 ALTER TABLE 修改属性即可接入存储策略:

ALTER TABLE casrs SET ("storage_policy" = "test_policy");

这样存量表后续写入的数据也会按照 cooldown_ttl 规则下沉,实现热数据留在本地、冷数据放到 HDFS 的分层存储,显著降低本地磁盘压力。

三、行列混存

Doris 默认是列式存储,适合聚合分析;但对于「按主键点查整行」的场景,列存需要读取大量列,效率不高。开启行存后形成行列混存,可以兼顾 OLAP 分析与点查性能。

CREATE TABLE cars_row (
    car varchar(255),
    city_code varchar(255),
    county_code varchar(255),
    card BIGINT,
    camera_id varchar(255),
    orientation varchar(255),
    road_id BIGINT,
    `time` BIGINT,
    speed DOUBLE
) DUPLICATE KEY(car)  -- 明细模型
DISTRIBUTED BY HASH(car) BUCKETS 10
PROPERTIES (
    "replication_num" = "1",
    "store_row_column" = "true",   -- 开启行存
    "row_store_page_size" = "4096" -- 行存页大小 4KB
);

两个关键属性:

  • store_row_column:是否额外存储一份行式数据,开启后点查走行存。
  • row_store_page_size:行存页大小,页越大点查吞吐越高但空间放大越明显,需要按场景权衡。

写入数据并验证:

INSERT INTO cars_row SELECT * FROM casrs;
-- 聚合查询:走列存
SELECT city_code, COUNT(1) AS num FROM cars_row GROUP BY city_code;
-- 点查:走行存
SELECT * FROM cars_row WHERE car = '皖A00ET9';

可以看到,同一张表既能高效做分组聚合,也能高效做整行点查,这正是行列混存的价值所在。

四、数据导入

Doris 提供了多种导入方式,选择依据主要是数据量大小和数据源位置。

方式适用场景特点
Stream Load小文件、本地文件、程序写入同步返回结果,简单直接
Broker LoadHDFS/S3 上的海量数据异步任务,适合大批量
MySQL Load本地 CSV 文件复用 MySQL 协议,使用方便

4.1 Stream Load:适合小文件导入

先准备目标表:

CREATE TABLE bigdata.test_streamload(
    user_id BIGINT NOT NULL COMMENT "用户 ID",
    name    VARCHAR(20)      COMMENT "用户姓名",
    age     INT              COMMENT "用户年龄"
)
DUPLICATE KEY(user_id)  -- 明细模型
DISTRIBUTED BY HASH(user_id) BUCKETS 10
PROPERTIES(
    "replication_num" = "1"
);

通过 HTTP 接口提交导入任务,支持远程连接 Doris:

curl --location-trusted -u root:123456 \
    -H "column_separator:," \
    -H "columns:user_id,name,age" \
    -T streamload_example.csv \
    -XPUT http://master:8034/api/bigdata/test_streamload/_stream_load

其中 column_separator 指定列分隔符,columns 用于声明文件列与表列的对应关系,便于处理列顺序不一致或需要过滤的场景。

4.2 Broker Load:适合海量数据导入

先建表:

CREATE TABLE cars_load (
    car varchar(255),
    city_code varchar(255),
    county_code varchar(255),
    card BIGINT,
    camera_id varchar(255),
    orientation varchar(255),
    road_id BIGINT,
    `time` BIGINT,
    speed DOUBLE
) DUPLICATE KEY(car)  -- 明细模型
DISTRIBUTED BY HASH(car) BUCKETS 10
PROPERTIES (
    "replication_num" = "1"
);

从 HDFS 加载 ORC 文件:

LOAD LABEL bigdata.cars_load1
(
    DATA INFILE("hdfs://master:9000/data/cars_orc/*")
    INTO TABLE cars_load
    FORMAT AS "orc"
)
WITH HDFS(
    "fs.defaultFS" = "hdfs://master:9000",
    "hadoop.username" = "root"
)
PROPERTIES (
    "timeout" = "12000",
    "max_filter_ratio" = "0.1"
);

参数说明:

  • timeout:任务超时时间(秒),大批量导入需要适当放大。
  • max_filter_ratio:允许过滤的数据比例,0.1 表示最多容忍 10% 的脏数据。

查看任务状态与取消任务:

-- 查看最近一次导入任务状态
SHOW LOAD ORDER BY createtime DESC LIMIT 1 \G;
-- 取消任务
CANCEL LOAD FROM bigdata WHERE LABEL = "cars_load1";

4.3 MySQL Load:本地文件快速导入

MySQL Load 复用 MySQL 协议,适合把本地 CSV 快速灌入 Doris:

mysql --local-infile -h master -P9030 -u root -p123456
LOAD DATA LOCAL
INFILE '/root/cars.csv'
INTO TABLE bigdata.casrs
COLUMNS TERMINATED BY ','
LINES TERMINATED BY '\n';

注意客户端需要开启 --local-infile,否则会报本地文件读取被禁用。

五、数据导出

与导入对应,Doris 也提供了多种导出方式,用于把结果数据交付给下游系统。

5.1 EXPORT 导出到 HDFS

EXPORT TABLE casrs
TO "hdfs://master:9000/data/doris/cars"
PROPERTIES(
    "column_separator" = ","
)
WITH HDFS (
    "fs.defaultFS" = "hdfs://master:9000",
    "hadoop.username" = "root"
);

查看与取消导出作业:

-- 查看导出状态
SHOW EXPORT \G;
-- 取消作业
CANCEL EXPORT FROM bigdata WHERE LABEL LIKE "%export_%";

5.2 SELECT INTO OUTFILE

如果只需要导出部分列或部分行,用 SELECT ... INTO OUTFILE 更灵活:

SELECT car, city_code, county_code
FROM casrs
INTO OUTFILE "hdfs://master:9000/data/doris/cars_csv/"
FORMAT AS csv
PROPERTIES(
    "fs.defaultFS" = "hdfs://master:9000",
    "hadoop.username" = "root"
);

5.3 mysqldump 导出

由于 Doris 兼容 MySQL 协议,可以直接用 mysqldump 导出表结构与数据:

mysqldump -hmaster -P9030 -uroot -p123456 --no-tablespaces \
    --databases bigdata --tables casrs > cars.sql

--no-tablespaces 用于跳过表空间查询,避免在 Doris 上执行时报错。

六、视图与物化视图

6.1 普通视图

普通视图不保存数据,只是一段 SQL 逻辑,可以简化查询写法,也可用于权限控制。

CREATE VIEW city_code_num_view AS
SELECT city_code, COUNT(1)
FROM casrs
GROUP BY city_code;

6.2 同步物化视图

同步物化视图会在基表数据变更时自动更新,查询时由优化器自动改写,无需手动指定。

-- 1、创建物化视图
CREATE MATERIALIZED VIEW city_code_num_mat_view AS
SELECT city_code, COUNT(1)
FROM casrs
GROUP BY city_code;
-- 2、查看构建进度
SHOW ALTER TABLE MATERIALIZED VIEW FROM bigdata \G;
-- 3、执行查询(优化器自动命中物化视图)
SELECT city_code, COUNT(1) FROM casrs GROUP BY city_code;
-- 通过 EXPLAIN 确认是否命中
EXPLAIN SELECT city_code, COUNT(1) FROM casrs GROUP BY city_code;

注意:同步物化视图不能直接 SELECT * FROM 视图名 查询,必须查询基表,由优化器判断是否改写。

6.3 手动刷新的物化视图

使用 REFRESH COMPLETE ON MANUAL 创建手动刷新的物化视图,适合对数据新鲜度要求不高的场景:

CREATE MATERIALIZED VIEW city_code_num_manual_view
REFRESH COMPLETE ON MANUAL
PROPERTIES(
    "replication_num" = "1"
)
AS
SELECT city_code, COUNT(1) FROM casrs GROUP BY city_code;
-- 查询视图
SELECT * FROM city_code_num_manual_view;
-- 手动触发刷新
REFRESH MATERIALIZED VIEW city_code_num_manual_view COMPLETE;

6.4 定时刷新的异步物化视图

异步物化视图支持按调度周期自动刷新,AUTO 表示增量分区刷新,COMPLETE 表示全量刷新:

CREATE MATERIALIZED VIEW city_code_num_manual2_view
REFRESH AUTO ON SCHEDULE EVERY 24 hour   -- 每隔 24 小时刷新
PROPERTIES(
    "replication_num" = "1"
)
AS
SELECT city_code, COUNT(1) FROM casrs GROUP BY city_code;

选择建议:

  • 数据量大、变更频繁:优先 AUTO 增量刷新,降低刷新开销。
  • 数据量小、逻辑复杂:使用 COMPLETE 全量刷新,保证结果正确。

七、总结

本文从五个维度梳理了 Doris 的常用能力:

  1. 冷热分层:通过 RESOURCE + STORAGE POLICY 把冷数据下沉到 HDFS,新表建表时绑定、存量表用 ALTER TABLE 接入。
  2. 行列混存:store_row_column 开启行存,兼顾聚合分析与主键点查。
  3. 数据导入:小文件用 Stream Load,海量数据用 Broker Load,本地 CSV 用 MySQL Load。
  4. 数据导出:EXPORT、SELECT INTO OUTFILE、mysqldump 三种方式按需选择。
  5. 物化视图:同步物化视图自动改写,异步物化视图支持手动与定时刷新。

实际落地时,建议先明确数据规模与查询模式,再选择对应的存储与导入导出方案,避免过度设计。

到此这篇关于Apache Doris 冷热分层、行列混存、数据导入导出与物化视图实战操作的文章就介绍到这了,更多相关Apache Doris 冷热数据分层内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • linux open函数用法详解 如何打开或创建文件并设置权限

    linux open函数用法详解 如何打开或创建文件并设置权限

    还在为Linux文件操作发愁?本文深入讲解open()和close()函数的用法,包括文件打开标志如O_CREAT、O_EXCL,以及mode参数与umask掩码如何共同决定文件权限,帮你轻松掌握文件描述符和权限设置
    2026-08-08
  • centos7.9重装系统为ubuntu18.04的实现过程

    centos7.9重装系统为ubuntu18.04的实现过程

    本文详细介绍了Ubuntu安装步骤,包括选择UEFI模式、安装镜像、启用网络更新、安装第三方软件(显卡驱动、解码器等)及分区设置(需用GParted格式化硬盘,注意swap文件系统),安装完成后需重启并移除安装介质
    2025-08-08
  • linux环境下安装 openOffice 并启动服务 的方法

    linux环境下安装 openOffice 并启动服务 的方法

    这篇文章主要介绍了linux环境下安装 openOffice 并启动服务 的方法,需要的朋友可以参考下
    2018-06-06
  • 在Linux服务器中查看运行的服务的方法汇总

    在Linux服务器中查看运行的服务的方法汇总

    在云服务器中,查看服务器具体运行的服务可以通过多种方法实现,具体的方法取决于你所使用的操作系统,常见的云服务器操作系统包括Linux(例如Ubuntu、CentOS等)和Windows Server,下面将分别介绍如何在这两种操作系统中查看正在运行的服务,需要的朋友可以参考下
    2025-05-05
  • Linux自动化构建工具make/Makefile和git使用及说明

    Linux自动化构建工具make/Makefile和git使用及说明

    本文介绍Linux下的make工具与Makefile自动化构建、缓冲区刷新及git版本控制操作,涵盖依赖关系处理、PHONY修饰、提交流程等关键点
    2025-09-09
  • Ubuntu上开启SSH服务的实现

    Ubuntu上开启SSH服务的实现

    本段文字的核心关键词为“Ubuntu开启SSH服务”、“openssh-server”和“查看SSH服务”,描述概括了在Ubuntu系统系统中安装和启动SSH服务的具体步骤,适合技术爱好者和初学者阅读以了解如何配置SSH服务
    2026-05-05
  • 详解CentOS8更换yum源后出现同步仓库缓存失败的问题

    详解CentOS8更换yum源后出现同步仓库缓存失败的问题

    这篇文章主要介绍了详解CentOS8更换yum源后出现同步仓库缓存失败的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • vscode连接远程Linux服务器及免密登陆的详细步骤

    vscode连接远程Linux服务器及免密登陆的详细步骤

    这篇文章主要介绍了vscode连接远程Linux服务器及免密登陆,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 详解CentOS 6.5如何安装Realtek无线网卡驱动

    详解CentOS 6.5如何安装Realtek无线网卡驱动

    相信大家都应该知道CentOS6.5不像CentOS7和Unbuntu那样自动安装好了无线网卡驱动,如果想要在CentOS 6.5上实现无线上网,我们就需要折腾一下,这篇文章给大家介绍了详细的步骤,感兴趣的朋友们下面来一起看看吧。
    2016-10-10
  • apache的access.log和error.log减肥

    apache的access.log和error.log减肥

    我的服务器是用apache搭建的,里面的access.log和error.log这两个文件要经常上去看,和清理,如果时间忙,忘记看和清理了,过不了多久,这两个文件就膨胀的非常的大,打都打不开了。
    2009-09-09

最新评论