Linux - Doris
环境:CentOS 7.9 / WSL2,Doris 3.1.4,二进制安装,单节点模式
一、前置依赖
1.1 确认 JDK 17
bash
java -version
echo $JAVA_HOME
# 确认输出 17.x,且 JAVA_HOME 已配置
1.2 检查 CPU 是否支持 AVX2
bash
cat /proc/cpuinfo | grep avx2 | head -1
# 有输出说明支持,下载普通版本
# 无输出说明不支持,需下载 noavx2 版本
1.3 系统参数调整
bash
# 关闭 swap(BE 要求)
swapoff -a
# 设置虚拟内存
echo "vm.max_map_count=2000000" >> /etc/sysctl.conf
sysctl -p
# 设置文件句柄数
cat >> /etc/security/limits.conf << 'EOF'
* soft nofile 1000000
* hard nofile 1000000
EOF
# WSL2 环境 limits.conf 不生效,在 .bashrc 里设置
echo "ulimit -n 1000000" >> ~/.bashrc
source ~/.bashrc
# 验证
ulimit -n
# 输出 1000000 表示成功
二、下载并解压
bash
# 下载二进制包(支持 AVX2 用此版本)
wget https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-3.1.4-bin-x64.tar.gz
# 解压到安装目录
tar -zxvf apache-doris-3.1.4-bin-x64.tar.gz -C /usr/local/
mv /usr/local/apache-doris-3.1.4-bin-x64 /usr/local/doris
目录结构:
/usr/local/doris/
├── fe/ # Frontend 节点(大脑)
├── be/ # Backend 节点(存储+计算)
├── ms/ # Meta Service(存算分离用,单节点忽略)
├── extensions/ # 扩展插件
└── tools/ # 工具
三、配置 FE
bash
vi /usr/local/doris/fe/conf/fe.conf
修改以下配置:
properties
# 元数据存储目录
meta_dir = /usr/local/doris/data/fe/meta
# 指定监听IP(单节点用127.0.0.1)
priority_networks = 127.0.0.1/32
# 禁用本地免密登录(可选,默认 true 允许免密)
skip_localhost_auth_check = false
bash
# 创建元数据目录
mkdir -p /usr/local/doris/data/fe/meta
四、配置 BE
bash
vi /usr/local/doris/be/conf/be.conf
修改以下配置:
properties
# 数据存储目录
storage_root_path = /usr/local/doris/data/be/storage
# 指定监听IP(和 FE 保持一致)
priority_networks = 127.0.0.1/32
bash
# 创建数据目录
mkdir -p /usr/local/doris/data/be/storage
五、启动服务
必须先启动 FE,再启动 BE
bash
# 启动 FE
/usr/local/doris/fe/bin/start_fe.sh --daemon
sleep 10
# 启动 BE
/usr/local/doris/be/bin/start_be.sh --daemon
sleep 10
# 验证进程
jps
# 看到 DorisFE 和 DorisBE 表示成功
六、注册 BE 到 FE
bash
# 连接 FE
mysql -h 127.0.0.1 -P 9030 -u root
# 注册 BE(只需执行一次)
ALTER SYSTEM ADD BACKEND "127.0.0.1:9050";
# 查看 BE 状态,Alive: true 表示成功
SHOW BACKENDS\G
七、配置 Service 管理脚本
bash
cat > /etc/init.d/doris << 'EOF'
#!/bin/bash
# chkconfig: 2345 90 10
# description: Apache Doris
DORIS_HOME=/usr/local/doris
JAVA_HOME=/usr/local/jdk/jdk
export JAVA_HOME
export PATH=$JAVA_HOME/bin:$DORIS_HOME/fe/bin:$DORIS_HOME/be/bin:$PATH
case "$1" in
start)
echo "Starting Doris FE..."
$DORIS_HOME/fe/bin/start_fe.sh --daemon
sleep 5
fe_pid=$(jps | grep DorisFE | awk '{print $1}')
if [ -n "$fe_pid" ]; then
echo "Doris FE started, PID: $fe_pid"
else
echo "Doris FE start failed, check logs"
fi
echo "Starting Doris BE..."
$DORIS_HOME/be/bin/start_be.sh --daemon
sleep 5
be_pid=$(jps | grep DorisBE | awk '{print $1}')
if [ -n "$be_pid" ]; then
echo "Doris BE started, PID: $be_pid"
else
echo "Doris BE start failed, check logs"
fi
;;
stop)
echo "Stopping Doris BE..."
$DORIS_HOME/be/bin/stop_be.sh
sleep 3
echo "Doris BE stopped"
echo "Stopping Doris FE..."
$DORIS_HOME/fe/bin/stop_fe.sh
sleep 3
echo "Doris FE stopped"
;;
restart)
$0 stop
sleep 3
$0 start
;;
status)
fe_pid=$(jps | grep DorisFE | awk '{print $1}')
be_pid=$(jps | grep DorisBE | awk '{print $1}')
if [ -n "$fe_pid" ]; then
echo "Doris FE is running, PID: $fe_pid"
else
echo "Doris FE is not running"
fi
if [ -n "$be_pid" ]; then
echo "Doris BE is running, PID: $be_pid"
else
echo "Doris BE is not running"
fi
;;
*)
echo "Usage: service doris {start|stop|restart|status}"
exit 1
;;
esac
EOF
chmod +x /etc/init.d/doris
chkconfig --add doris
常用命令:
bash
service doris start
service doris stop
service doris restart
service doris status
八、用户与密码管理
bash
# root 连接(本地127.0.0.1默认免密)
mysql -h 127.0.0.1 -P 9030 -u root
# 设置 root 密码
SET PASSWORD FOR 'root'@'%' = PASSWORD('your_password');
# 创建业务用户(推荐,用于应用连接)
CREATE USER 'doris_user'@'%' IDENTIFIED BY 'your_password';
GRANT ALL ON *.* TO 'doris_user'@'%';
本地
127.0.0.1默认免密登录(可通过skip_localhost_auth_check = false关闭)内网 IP 连接必须输入密码,生产环境建议使用业务用户而非 root
九、基本使用
sql
-- 查看版本
SELECT VERSION();
-- 创建数据库
CREATE DATABASE my_db;
USE my_db;
-- 创建表(示例)
CREATE TABLE order_create (
id BIGINT NOT NULL,
company_id VARCHAR(32),
order_id VARCHAR(32),
order_time BIGINT,
insert_time DATETIME DEFAULT CURRENT_TIMESTAMP
)
UNIQUE KEY(id, company_id, order_id)
PARTITION BY RANGE(order_time)(
PARTITION p202401 VALUES LESS THAN ("1706745600"),
PARTITION p202402 VALUES LESS THAN ("1709251200")
)
DISTRIBUTED BY HASH(order_id) BUCKETS 16
PROPERTIES("replication_num" = "1");
-- 批量插入
INSERT INTO order_create VALUES
(1, 'company001', 'ORDER001', 1704067200, NOW()),
(2, 'company001', 'ORDER002', 1704067200, NOW());
-- 查询
SELECT * FROM order_create;
十、端口说明
FE 端口:
| 端口 | 用途 | 是否对外 |
|---|---|---|
9030 |
MySQL 协议,客户端连接 | ✅ 必须 |
8030 |
HTTP,WebUI / Stream Load | ✅ 按需 |
9020 |
FE 与 BE 内部 RPC | ❌ 内部 |
9010 |
FE 节点选举 | ❌ 内部 |
BE 端口:
| 端口 | 用途 | 是否对外 |
|---|---|---|
9050 |
心跳端口,注册 BE 时用 | ❌ 内部 |
9060 |
查询执行 | ❌ 内部 |
8040 |
BE HTTP / Stream Load 直写 | ✅ 按需 |
8060 |
BE RPC | ❌ 内部 |
对外只需开放
9030,使用 Stream Load 时额外开放8030
十一、Kafka → Doris Routine Load
Doris 原生支持消费 Kafka JSON 数据直接入库:
sql
CREATE ROUTINE LOAD my_db.load_order_create
ON order_create
COLUMNS(company_id, order_id, order_time, insert_time)
PROPERTIES(
"format" = "json",
"json_root" = "$",
"desired_concurrent_number" = "3",
"max_batch_interval" = "10",
"max_batch_rows" = "3000000",
"strict_mode" = "false"
)
FROM KAFKA(
"kafka_broker_list" = "127.0.0.1:9092",
"kafka_topic" = "order-create-topic",
"property.group.id" = "doris_group"
);
-- 查看任务状态
SHOW ROUTINE LOAD FOR load_order_create\G
-- 暂停 / 恢复
PAUSE ROUTINE LOAD FOR load_order_create;
RESUME ROUTINE LOAD FOR load_order_create;
十二、注意事项
- FE 和 BE 必须先启 FE 再启 BE,停止顺序相反
- BE 注册到 FE 只需执行一次,重启不需要重新注册
- 单节点
replication_num必须设为1 - Doris 写入必须批量提交,避免单条频繁写入产生小文件
- WSL2 环境
limits.conf不持久,需在.bashrc中设置ulimit stat table does not exist日志为正常现象,BE 注册后自动消失