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.defaultFS | HDFS 的 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 Load | HDFS/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 的常用能力:
- 冷热分层:通过
RESOURCE+STORAGE POLICY把冷数据下沉到 HDFS,新表建表时绑定、存量表用ALTER TABLE接入。 - 行列混存:
store_row_column开启行存,兼顾聚合分析与主键点查。 - 数据导入:小文件用 Stream Load,海量数据用 Broker Load,本地 CSV 用 MySQL Load。
- 数据导出:EXPORT、SELECT INTO OUTFILE、mysqldump 三种方式按需选择。
- 物化视图:同步物化视图自动改写,异步物化视图支持手动与定时刷新。
实际落地时,建议先明确数据规模与查询模式,再选择对应的存储与导入导出方案,避免过度设计。
到此这篇关于Apache Doris 冷热分层、行列混存、数据导入导出与物化视图实战操作的文章就介绍到这了,更多相关Apache Doris 冷热数据分层内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
linux open函数用法详解 如何打开或创建文件并设置权限
还在为Linux文件操作发愁?本文深入讲解open()和close()函数的用法,包括文件打开标志如O_CREAT、O_EXCL,以及mode参数与umask掩码如何共同决定文件权限,帮你轻松掌握文件描述符和权限设置2026-08-08
centos7.9重装系统为ubuntu18.04的实现过程
本文详细介绍了Ubuntu安装步骤,包括选择UEFI模式、安装镜像、启用网络更新、安装第三方软件(显卡驱动、解码器等)及分区设置(需用GParted格式化硬盘,注意swap文件系统),安装完成后需重启并移除安装介质2025-08-08
linux环境下安装 openOffice 并启动服务 的方法
这篇文章主要介绍了linux环境下安装 openOffice 并启动服务 的方法,需要的朋友可以参考下2018-06-06
Linux自动化构建工具make/Makefile和git使用及说明
本文介绍Linux下的make工具与Makefile自动化构建、缓冲区刷新及git版本控制操作,涵盖依赖关系处理、PHONY修饰、提交流程等关键点2025-09-09


最新评论