doris4.1.1安装教程

1.Doris 简介

官网:

https://doris.apache.org/zh-CN/docs/gettingStarted/what-is-apache-doris

Doris 2.1.10 版本 存算一体架构 (不需要依赖任何的别的技术)

Doris3 存算分离 算(doris 的计算引擎) 存(可以使用第三方比如 hdfs s3 的)也当然支持存算一体

Doris4 加入了 AI 功能

Doris 概述

Apache Doris 简介

Apache Doris 是一款基于 MPP 架构的高性能、实时分析型数据库 。它以高效、简单和统一的特性著称,能够在亚秒级的时间内返回海量数据的查询结果。Doris 既能支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。

MPP = Massively Parallel Processing,大规模并行处理数据库 ,核心底层是 Shared-Nothing(无共享)分布式架构

和这个数据库非常相似的是 ClickHouse

基于这些优势,Apache Doris 非常适合用于报表分析、即席查询、统一数仓构建、数据湖联邦查询加速等场景。用户可以基于 Doris 构建大屏看板、用户行为分析、AB 实验平台、日志检索分析、用户画像分析、订单分析等应用。

2、安装

Apache Doris 4.1.1 版本已于 2026-04-21正式发布

官方安装文档:

下载:

可以使用 cpu 工具查看,cpu 知否支持 avx2 指令集:

2.1 安装前的准备工作

安装 jdk17

复制代码
tar -zxvf jdk-17.0.17_linux-x64_bin.tar.gz -C /opt/installs/
重命名:
mv jdk-17.0.17 jdk

修改环境变量:/etc/profile
#export JAVA_HOME=/opt/installs/jdk1.8
export JAVA_HOME=/opt/installs/jdk
export PATH=$PATH:$JAVA_HOME/bin

分发jdk以及配置文件
myscp /opt/installs/jdk
myscp /etc/profile

刷新环境变量:
source /etc/profile

myscp 是自己编写的分发脚本,如果你没有,可以使用scp 命令代替

设置系统最大文件打开句柄数

复制代码
1.打开文件
vi /etc/security/limits.conf 

2.在文件最后添加下面几行信息(注意* 也要复制进去)

* soft nofile 65536
* hard nofile 65536 
* soft nproc 65536
* hard nproc 65536

ulimit -n 65536 临时生效

修改完文件后需要重新启动虚拟机
重启永久生效,也可以用


如果不修改这个句柄数大于等于60000,回头启动doris的be节点的时候就会报如下的错
如果报错:Please set the maximum number of open file descriptors to be 65536 using 'ulimit -n 65536'.
代表句柄数没有生效,需要临时设置或者重启电脑


第一次启动的时候可能会报错
Please set vm.max_map_count to be 2000000 under root using 'sysctl -w vm.max_map_count=2000000'.
解决方案:
命令行输入:sysctl -w vm.max_map_count=2000000

记得将该文件分发到不同的服务器上。

myscp /etc/security/limits.conf

设置文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量

sysctl.conf 修改

复制代码
临时生效:
sysctl -w vm.max_map_count=2000000

永久生效
vim /etc/sysctl.conf
在文件最后一行添加
vm.max_map_count=2000000

让他永久生效
sysctl -p

检查是否生效
sysctl -a|grep vm.max_map_count

分发一下:
myscp /etc/sysctl.conf

时钟同步

Doris 的元数据要求时间精度要小于5000ms,所以所有集群所有机器要进行时钟同步,避免因为时钟问题引发的元数据不一致导致服务出现异常。

复制代码
systemctl restart chronyd
这个命令写完之后需要等一会儿才会变为新日期。
xcall.sh ntpdate time1.aliyun.com

关闭交换分区(swap)

交换分区是linux用来当做虚拟内存用的磁盘分区;

linux可以把一块磁盘分区当做内存来使用(虚拟内存、交换分区);

Linux使用交换分区会给Doris带来很严重的性能问题,建议在安装之前禁用交换分区;

复制代码
1、查看 Linux 当前 Swap 分区
free -m
2、关闭 Swap 分区  (临时关闭)
swapoff -a

[root@hadoop11 app]# free -m
              total        used        free      shared  buff/cache   available
Mem:           5840         997        4176           9         666        4604
Swap:          6015           0        6015
[root@hadoop11 app]# swapoff -a

3.验证是否关闭成功
[root@hadoop11 app]# free -m   
              total        used        free      shared  buff/cache   available
Mem:           5840         933        4235           9         671        4667
Swap:             0           0           0

记得三台都需要关闭:
xcall swapoff -a

如果想永久关闭,需要修改配置文件:

复制代码
vi /etc/fstab

可以按照如下方式进行操作:

千万不要粘贴官方给的配置文件,以供参考

假如你粘贴了官网这个配置,重启后报如下错误:(输入 root 的密码可以进入,在将其文件改回来)

所以解决方案有两种:

方案一:将 swap 注释取消,每次重启使用swapoff -a 关闭

方案二:检查你是否粘贴了官方文档中的 内容,如果是删除掉,仅仅注释这行 swap 即可。

分发一下:

复制代码
myscp /etc/fstab

注意事项:

  1. FE 的磁盘空间主要用于存储元数据,包括日志和 image。通常从几百 MB 到几个GB 不等。
  2. BE 的磁盘空间主要用于存放用户数据,总磁盘空间按用户总数据量* 3(3 副本)计算,然后再预留额外 40%的空间用作后台 compaction 以及一些中间数据的存放。
  3. 一台机器上可以部署多个 BE 实例,但是只能部署一个 FE(FE 可以部署三台用于自动容灾)。如果需要 3 副本数据,那么至少需要 3 台机器各部署一个 BE 实例(而不是 1 台机器部署 3 个 BE 实例)。多 个 FE 所在服务器的时钟必须保持一致(允许最多 5 秒的时钟偏差)
  4. 测试环境也可以仅适用一个 BE 进行测试。实际生产环境,BE 实例数量直接决定了整体查询延迟。
  5. 所有部署节点关闭 Swap。
  6. FE 节点数据至少为 1(1 个 Follower)。当部署 1 个 Follower 和 1 个 Observer 时,可以实现读高可用。当部署 3 个 Follower 时,可以实现读写高可用(HA)。
  7. Follower 的数量必须为奇数,Observer 数量随意。
  8. 根据以往经验,当集群可用性要求很高时(比如提供在线业务),可以部署 3 个Follower 和 1-3 个 Observer。如果是离线业务,建议部署 1 个 Follower 和 1-3 个 Observer。
  9. Broker 是用于访问外部数据源(如 HDFS)的进程。通常,在每台机器上部署一个 broker 实例即可。

禁用透明大页 (Transparent Huge Pages)

为避免 THP 引发内存碎片与不可预期的延迟抖动,需要在运行期禁用并设置开机持久化 三台节点都需执行

复制代码
## 立即禁用(当前运行期临时有效)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

## 永久有效(写入开机持久化) 这里和图中不太一样,以这里为准;
cat >> /etc/rc.d/rc.local <<'EOF'
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
EOF

## 赋权
chmod +x /etc/rc.d/rc.local

记得分发一下:
myscp /etc/rc.d/rc.local

将三台虚拟机重新启动,可以使用 reboot 命令。

2.2安装FE

官方手动安装手册:

https://doris.apache.org/zh-CN/docs/install/deploy-manually/integrated-storage-compute-deploy-manually

  1. 上传apache-doris-4.1.1-bin-x64.tar.gz到linux

  2. 解压

    cd /opt/modules/
    tar -zxvf apache-doris-4.1.1-bin-x64.tar.gz -C /opt/installs/
    mv apache-doris-4.1.1-bin-x64/ doris

    doris1.x 没有doris-meta文件夹,doris2.x已经有这个文件夹了,但是不建议直接使用

  3. 修改配置文件

    -- fe.conf文件:位于fe安装目录下的conf目录
    vi /opt/installs/doris/fe/conf/fe.conf

    JAVA_OPTS="-Xmx16384m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:DORIS_HOME/log/fe.gc.log.DATE"
    priority_networks = 192.168.119.11/24
    lower_case_table_names = 1
    JAVA_HOME = /opt/installs/jdk

假如你的虚拟机内存设置比较小,启动会报内存不够,需要修改如下地方:

复制代码
# For jdk 17, this JAVA_OPTS will be used as default JVM options
JAVA_OPTS_FOR_JDK_17="-Dfile.encoding=UTF-8 -Djavax.security.auth.useSubjectCredsOnly=false -Xmx8192m -Xms4096m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOG_DIR -Xlog:gc*:$LOG_DIR/fe.gc.log.$CUR_DATE:time,uptime:filecount=10,filesize=50M -Darrow.enable_null_check_for_get=false --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/sun.nio.cs=ALL-UNNAMED --add-opens=java.base/sun.security.action=ALL-UNNAMED --add-opens=java.base/sun.util.calendar=ALL-UNNAMED --add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED --add-opens=java.management/sun.management=ALL-UNNAMED --add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.xml/com.sun.org.apache.xerces.internal.jaxp=ALL-UNNAMED"

将此处的-Xms8192m 修改为 -Xms4096m

4、环境变量配置

复制代码
export DORIS_HOME=/opt/installs/doris
export PATH=$PATH:$DORIS_HOME/fe/bin:$DORIS_HOME/be/bin


myscp /etc/profile.d/myenv.sh
source /etc/profile

5、 分发集群(如果是伪分布的不需要分发)

复制代码
myscp /opt/installs/doris

为了以后将来可能会启动多台 fe,最好将 hadoop12 和 hadoop13 上的 fe.conf 中的 ip 修改为对应节点上的 ip

我们此处只需要一台 Fe,所以不修改

6、 启动

复制代码
进入到fe的bin目录下执行
[root@hadoop11 bin]# start_fe.sh --daemon

生产环境强烈建议单独指定目录不要放在 Doris 安装目录下,最好是单独的磁盘(如果有 SSD 【固态】 最好)。 如果机器有多个 ip, 比如内网外网, 虚拟机 docker 等, 需要进行 ip 绑定,才能正确识别。 JAVA_OPTS 默认 java 最大堆内存为 4GB,建议生产环境调整至 16G 以上。

如果 FE 启动失败,可以查看对应的 log 日志

E 进程将在后台启动,日志默认保存在 log/ 目录。如果启动失败,可通过查看 log/fe.loglog/fe.out 文件获取错误信息。

com.sleepycat.je.rep.ReplicaWriteException: (JE 18.3.12) Problem closing transaction 27. The current state is:UNKNOWN. The node transitioned to this state at:Thu Dec 19 16:44:14 CST 2024

如果遇到这个错误,一般是你的磁盘空间,不够 6G,可以通过删除一些无用的安装包或者日志。

然后删除元数据后重启启动,否则会报这个错误:

2024-12-19 16:48:25,483 ERROR (stateListener|67) Env.checkCurrentNodeExist():1540 current node 192.168.177.128:9010 is not added to the cluster, will exit. Your FE IP maybe changed, please set 'priority_networks' config in fe.conf properly.

检查 FE 启动状态

通过 MySQL 客户端连接 Doris 集群,初始化用户为 root,默认密码为空。

复制代码
mysql -uroot -P<fe_query_port> -h<fe_ip_address>

mysql -uroot -P9030 -h127.0.0.1 -e "show frontends;"

启动 fe 需要 一点时间,如果连接不成功,稍微等一会儿。

打印混乱,可以通过粘贴到 nodepad++等工具中展示完全:

链接到 Doris 集群后,可以通过 show frontends 命令查看 FE 的状态,通常要确认以下几项

    • Alive 为 true 表示节点存活;
    • Join 为 true 表示节点加入到集群中,但不代表当前还在集群内(可能已失联);
    • IsMaster 为 true 表示当前节点为 Master 节点。

查看 web 界面

http://hadoop11:8030/ 账号 root,密码是空

通过 MySQL 客户端连接 Doris 集群,初始化用户为 root,默认密码为空。

可能引发的一个问题:

当我启动 ResourceManager 的时候,会报 8030 端口被占用了。原因是 doris 启动会占用该端口,解决办法:要么使用哪个启动哪个,要么修改 doris 的端口。8030 端口属于 FE 的端口。

解决步骤:

查看端口使用情况:

还有一个问题:为什么启动后,FE 显示角色为 Follwer?

2.3安装BE

创建 BE 数据存放目录(每个节点

复制代码
mkdir /opt/installs/doris/doris-storage1
mkdir /opt/installs/doris/doris-storage2

进入到be的conf目录下修改配置文件

复制代码
vim /opt/installs/doris/be/conf/be.conf



storage_root_path=/opt/installs/doris/doris-storage1;/opt/installs/doris/doris-storage2
priority_networks = 192.168.119.11/24
JAVA_HOME = /opt/installs/jdk
复制代码
cd /opt/installs/doris/be/conf
myscp be.conf

记得修改hadoop12和hadoop13的IP地址

第一次启动的时候可能会报错
Please set vm.max_map_count to be 2000000 under root using 'sysctl -w vm.max_map_count=2000000'.
解决方案:
命令行输入:sysctl -w vm.max_map_count=2000000

如果报错:Please set the maximum number of open file descriptors to be 65536 using 'ulimit -n 65536'.

注意事项:

storage_root_path 默认在 be/storage 下,需要手动创建该目录。多个路径之间使用英文状态的分号;分隔(最后一个目录后不要加)。

可以通过路径区别存储目录的介质,HDD 或 SSD。可以添加容量限制在每个路径的末尾,通过英文状态逗号,隔开,如:

storage_root_path=/home/disk1/doris.HDD,50;/home/disk2/doris.SSD,10;/home/disk2/doris

说明:

/home/disk1/doris.HDD,50,表示存储限制为 50GB,HDD;

/home/disk2/doris.SSD,10,存储限制为 10GB,SSD;

/home/disk2/doris,存储限制为磁盘最大容量,默认为 HDD

这样就好了嘛?不是哦

be可以先不启动,因为启动也没啥用。

因为FE和BE两个都是单独的个体,所以他俩相互间还不认识,就需要我们通过mysql的客户端将他们建立起联系

如果没有装mysql的,记得先装mysql

使用 MySQL Client 连接 FE

复制代码
mysql -h hadoop11 -P 9030 -uroot

第一次没有密码可以进入。

查看 BE 状态

复制代码
SHOW PROC '/backends'\G;

Alive 为 false 表示该 BE 节点还是死的

添加BE

复制代码
mysql> ALTER SYSTEM ADD BACKEND "hadoop11:9050";

如果是全分布的,需要输入三个命令
mysql> ALTER SYSTEM ADD BACKEND "hadoop12:9050";
mysql> ALTER SYSTEM ADD BACKEND "hadoop13:9050";

如果删除的话使用如下命令:
ALTER SYSTEM dropp BACKEND "hadoop13:9050";

启动BE

复制代码
启动 BE(每个节点) 
start_be.sh --daemon

启动后再次查看BE的节点   如果没有设置密码,可以不添加123456这个密码
mysql -h hadoop11 -P 9030 -uroot -p123456
SHOW PROC '/backends'\G; 
Alive 为 true 表示该 BE 节点存活。

2.5 验证集群正确性

复制代码
-- create a test database
create database testdb;
 
-- create a test table
CREATE TABLE testdb.table_hash
(
  k1 TINYINT,
  k2 DECIMAL(10, 2) DEFAULT "10.5",
  k3 VARCHAR(10) COMMENT "string column",
  k4 INT NOT NULL DEFAULT "1" COMMENT "int column"
)
COMMENT "my first table"
DISTRIBUTED BY HASH(k1) BUCKETS 32;

DISTRIBUTED BY HASH(k1) BUCKETS 32包含以下几个关键信息:

  1. 数据分布方式:HASH(k1)表示数据将按照k1列的哈希值进行分布
    • 相同k1值的数据会被分配到同一个数据分片(Tablet)中
    • 这种分布方式有利于基于k1的等值查询和join操作
  1. 分片数量:BUCKETS 32表示将表数据划分为32个分片(Tablet)
    • 每个分片是数据存储和计算的基本单元
    • 分片数量影响查询并行度和数据均衡性

2.6 修改 Doris 集群密码

在创建 Doris 集群时,系统会自动创建一个名为 root 的用户,并默认设置其密码为空。为了提高安全性,建议在集群创建后立即为 root 用户设置一个新密码

SET PASSWORD = PASSWORD('123456');

2.7 使用DataGrip连接doris