Apache Doris 使用指南:从入门到生产实践

目录

一、Doris 核心概念

1.1 架构组成

1.2 数据模型

二、Doris 部署方式

2.1 单机部署(测试环境)

2.2 集群部署(生产环境)

三、数据操作指南

3.1 数据库与表管理

3.2 数据导入方式

3.2.1 批量导入

3.2.2 实时导入

3.3 数据查询示例

四、性能优化实践

4.1 分区分桶策略

4.2 索引优化

4.3 查询优化技巧


Apache Doris 是一款高性能、实时的分析型数据库,广泛应用于大数据分析、实时报表等场景。本文将全面介绍 Doris 的核心概念、部署方式、数据操作及优化技巧。

下面附上官网地址:

Doris官网https://doris.apache.org/zh-CN/docs/dev/gettingStarted/what-is-apache-doris

一、Doris 核心概念

1.1 架构组成

  • FE (Frontend)​​:负责元数据管理、客户端连接和查询计划生成
  • BE (Backend)​​:负责数据存储和查询执行
  • Broker​:用于访问外部存储系统(如HDFS/S3)

1.2 数据模型

  • 明细模型(Duplicate Key)​​:适合原始数据存储
  • 聚合模型(Aggregate Key)​​:预聚合提高查询性能
  • 主键模型(Unique Key)​​:支持实时更新
  • 更新模型(Merge-on-Write)​​:2.0版本新增,更高性能更新

二、Doris 部署方式

2.1 单机部署(测试环境)

# 下载解压
wget https://apache-doris-releases.oss-accelerate.aliyuncs.com/doris-1.2.4-bin.tar.gz
tar -zxvf doris-1.2.4-bin.tar.gz

# 启动FE
cd fe/bin/
./start_fe.sh --daemon

# 启动BE
cd be/bin/
./start_be.sh --daemon

2.2 集群部署(生产环境)

-- 在FE节点添加BE节点
ALTER SYSTEM ADD BACKEND "be1:9050";
ALTER SYSTEM ADD BACKEND "be2:9050";
ALTER SYSTEM ADD BACKEND "be3:9050";

-- 查看节点状态
SHOW PROC '/backends';

三、数据操作指南

3.1 数据库与表管理

-- 创建数据库
CREATE DATABASE demo_db;

-- 创建明细表
CREATE TABLE demo_db.user_behavior (
    user_id LARGEINT NOT NULL,
    item_id LARGEINT NOT NULL,
    behavior_type VARCHAR(20),
    ts DATETIME NOT NULL
)
DUPLICATE KEY(user_id, item_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 10
PROPERTIES (
    "replication_num" = "3",
    "storage_medium" = "SSD"
);

-- 创建聚合表
CREATE TABLE demo_db.sales_agg (
    dt DATE NOT NULL,
    product_id LARGEINT NOT NULL,
    user_region VARCHAR(50),
    SUM(sales_amount) BIGINT SUM,
    COUNT(sales_count) BIGINT COUNT
)
AGGREGATE KEY(dt, product_id, user_region)
DISTRIBUTED BY HASH(product_id) BUCKETS 10;

3.2 数据导入方式

3.2.1 批量导入
-- 本地文件导入
LOAD LABEL demo_db.label_20231101
(DATA INFILE("hdfs://path/to/file.parquet")
INTO TABLE user_behavior
FORMAT AS "parquet")
WITH BROKER "hdfs_broker";

-- Stream Load(HTTP API)
curl --location-trusted -u user:passwd \
-H "column_separator:," \
-T data.csv \
http://fe_host:8030/api/demo_db/user_behavior/_stream_load
3.2.2 实时导入
-- Kafka实时接入
CREATE ROUTINE LOAD demo_db.kafka_load ON user_behavior
COLUMNS(user_id, item_id, behavior_type, ts)
PROPERTIES (
    "desired_concurrent_number" = "3",
    "max_batch_interval" = "20",
    "max_batch_rows" = "300000"
)
FROM KAFKA (
    "kafka_broker_list" = "broker1:9092,broker2:9092",
    "kafka_topic" = "user_events",
    "property.group.id" = "doris_consumer"
);

3.3 数据查询示例

-- 基础查询
SELECT 
    user_region,
    SUM(sales_amount) AS total_sales
FROM sales_agg
WHERE dt BETWEEN '2023-10-01' AND '2023-10-31'
GROUP BY user_region
ORDER BY total_sales DESC
LIMIT 10;

-- 窗口函数
SELECT 
    user_id,
    ts,
    behavior_type,
    COUNT(*) OVER (PARTITION BY user_id ORDER BY ts RANGE INTERVAL 1 HOUR PRECEDING) AS hourly_actions
FROM user_behavior;

-- 物化视图加速查询
CREATE MATERIALIZED VIEW mv_user_behavior_hourly
REFRESH EVERY INTERVAL 1 HOUR
AS
SELECT 
    user_id,
    DATE_TRUNC('HOUR', ts) AS hour,
    COUNT(*) AS action_count,
    SUM(CASE WHEN behavior_type = 'buy' THEN 1 ELSE 0 END) AS buy_count
FROM user_behavior
GROUP BY user_id, DATE_TRUNC('HOUR', ts);

四、性能优化实践

4.1 分区分桶策略

-- 按天分区+哈希分桶
CREATE TABLE time_series_data (
    ts DATETIME NOT NULL,
    device_id LARGEINT NOT NULL,
    metric_value DOUBLE
)
ENGINE=OLAP
DUPLICATE KEY(ts, device_id)
PARTITION BY RANGE(ts) (
    PARTITION p202301 VALUES LESS THAN ('2023-02-01'),
    PARTITION p202302 VALUES LESS THAN ('2023-03-01'),
    PARTITION p202303 VALUES LESS THAN ('2023-04-01')
)
DISTRIBUTED BY HASH(device_id) BUCKETS 32
PROPERTIES (
    "replication_num" = "3",
    "storage_medium" = "SSD",
    "storage_cooldown_time" = "7 days"
);

4.2 索引优化

-- 添加倒排索引
ALTER TABLE user_behavior 
ADD INDEX idx_behavior_type (behavior_type) USING INVERTED;

-- 添加Bloom Filter索引
ALTER TABLE sales_agg 
ADD INDEX bf_product_id (product_id) USING BLOOM_FILTER;

4.3 查询优化技巧

-- 使用分区裁剪
SELECT * FROM time_series_data 
WHERE ts BETWEEN '2023-03-15' AND '2023-03-20';

-- 使用Bucket裁剪
SELECT * FROM user_behavior 
WHERE user_id = 10086;

-- 使用Colocate Group
CREATE TABLE colocate_table (
    user_id BIGINT,
    item_id BIGINT
)
DISTRIBUTED BY HASH(user_id) BUCKETS 10
PROPERTIES (
    "colocate_with" = "user_group"
);

本文部分技术描述基于Apache Doris官方文档[1]及社区公认技术实践,相关SQL语法示例参考自开源项目文档。
[1] 官方文档链接:https://doris.apache.org/docs/ 

### 关于 Apache Doris 的介绍 Apache Doris 是一个现代化的分布式 SQL 数据库,专为实时分析而设计。该数据库支持多维在线分析处理(OLAP),能够快速执行复杂的查询操作并返回结果。其架构旨在提供高吞吐量的同时保持低延迟特性,在大规模数据集上的表现尤为突出[^1]。 #### 主要特点 - **高性能**:通过向量化执行引擎以及先进的索引技术来加速读取性能; - **易用性**:兼容 MySQL 协议,允许用户利用现有的 BI 工具轻松连接至系统; - **灵活性**:不仅适合传统的报表应用,也适用于交互式探索和即席查询等场景; - **扩展性强**:水平伸缩能力使得集群可以根据业务需求动态调整规模; ### 使用教程概览 为了帮助初次接触此系统的开发者更好地理解和掌握如何部署与管理 Apache Doris 实例,下面给出了一套简化版的操作指南: #### 准备工作环境 确保目标机器已安装 Docker 及相关依赖项之后,可以从官方镜像拉取最新版本的软件包,并启动容器实例[^2]: ```bash docker pull apachedoris/doris:latest docker run -d --name doris_fe -p 8030:8030 -e DORIS Fe.META_DIR=/var/lib/doris/meta apachedoris/doris frontend ``` 上述命令创建了一个名为 `doris_fe` 的前端节点服务进程,监听本地端口 8030 提供 Web UI 访问接口。 #### 初始化配置文件 进入刚刚建立好的容器内部修改必要的参数设置以适应特定的工作负载模式: ```bash docker exec -it doris_fe bash cd /path/to/conf/ vi fe.conf ``` 编辑完成后保存更改退出编辑器即可生效新的设定值。 #### 创建表结构定义语句 接下来编写用于描述待导入关系型表格元信息的 SQL 脚本片段如下所示: ```sql CREATE TABLE IF NOT EXISTS sales ( order_id BIGINT, product_name STRING, quantity INT, price DECIMAL(9, 2), sale_date DATE ) ENGINE=OLAP DUPLICATE KEY(order_id) DISTRIBUTED BY HASH(order_id) BUCKETS 10; ``` 这段代码声明了一个简单的销售记录集合模型,其中包含了订单编号、商品名称等多个字段属性。 #### 导入外部数据源 当完成前面几步准备工作以后就可以着手准备实际的数据加载流程了。这里假设有一个 CSV 文件位于主机目录下等待被批量插入到刚才新建的目标表内: ```bash LOAD LABEL example_db.label_1 ( DATA INFILE ("file:///host/path/sales.csv") INTO TABLE sales COLUMNS TERMINATED BY "," (order_id, product_name, quantity, price, sale_date) ); ``` 以上就是有关 Apache Doris 基础入门的一些指导说明,希望能够为广大用户提供有价值的参考资料和支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值