PowerData

编者荐语:

一篇快速简洁的安装部署文章喔

以下文章来源于Apache Doris 补习班 ,作者苏奕嘉

[

Apache Doris 补习班 .

Apache Doris Active Contributor 和 SelectDB SA 来做的不定时更新,主打 Apache Doris 系列学习文章和相关信息、原理解析或者新特性使用教程,争取 All In 原创,欢迎投稿~

](#)

文章说明

本篇只做简洁的 Apache Doris 部署流程介绍,不做过多的 Doris 特性和细节参数介绍,只专注于如何快速部署和启动以及测试使用。

和官网最大的区别在于只需跟着步骤走,不需要关注太多额外的东西,其他额外的参数也好、原理也罢,都会在后续文章或者官网文档里进行详尽说明~

后续【Apache Doris 补习班】公众号的文章风格皆为如此,标题讲什么,就会简明扼要的说清楚是什么、怎样做,尽可能减少大家阅读压力,短篇幅也能得到大收获。

架构简介

Apache Doris 是一款 MPP 架构的实时数据仓库,已全面实现向量化引擎。

在架构上:

  1. 1. 只有两个进程,FE(Frontend)和 BE(Backend),且两个进程皆独立运行
  2. 2. 不需要除 JDK 环境以外的任何三方组件依赖

其中,FE 负责元数据存储、查询语法解析、查询任务下发以及对外交互,BE 负责实际数据存储、执行计算

在部署上:

  1. 1. 可以从单节点 1FE + 1BE 起步部署,支持极简水平扩缩容,扩缩容皆会自动 reblance,无需人工干预
  2. 2. 从系统角度,当前支持 Linux OS、Windows WLS2环境编译和部署,支持 MacOS 编译和 Docker 部署,暂不支持裸机部署
  3. 3. 从介质角度,当前支持裸机部署、虚机部署、Docker部署,后续支持 K8S 部署。

在环境上:

  1. 1. CentOS 系统需 7.1 及以上,Ubuntu 系统需要 16.04 及以上
  2. 2. JDK 建议使用 1.8,GCC 需要 4.8.2 及以上

部署步骤

部署以 linux 系统为例,分为裸机/虚机部署和 Docker 部署。

其中需要注意的是,生产只建议使用裸机/虚机部署,当前版本不建议使用 Docker 部署生产环境!

裸机/虚机部署

注意事项

  1. 1. FE 节点推荐 8C16G 机器部署,BE 节点最低推荐 8C32G 机器部署
  2. 2. FE 节点核存比推荐 1:2,BE 节点核存比推荐 1:4
  3. 3. 如果单节点内存大于等于128G,可以混部(节点上即部署 FE 也部署 BE),若小于该值,建议独立部署(单节点上只部署 FE 或者 BE)

部署前置工作

  1. 1. 设置系统最大打开文件句柄数
vi /etc/security/limits.conf 
* soft nofile 65536
* hard nofile 65536

重启机器使其生效,或者执行以下命令让当前临时生效

ulimit -n 65535
  1. 1. 调整时钟同步Doris 的元数据要求时间精度要小于 5000 ms,所以所有集群所有机器要进行时钟同步
  2. 2. 调整机器 max_map_conut 值
sysctl -w vm.max_map_count=2000000
  1. 1. 确保剩余空间大于 5GB
df -H

部署流程

  1. 1. 查看当前系统架构及 CPU 指令集
uname -a
cat /proc/cpuinfo | grep avx2

根据第一条命令的返回值确定是 X86\_64 机器还是 ARM(Aarch)机器。

如果是 X86\_64 的机器,根据第二条命令是否有返回值确定是否有 AVX2 指令集,有返回值则为支持 AVX2 指令集的 CPU,反之亦然。

  1. 1. 如果是 ARM(Aarch)架构,则选择 ARM64 版本下载,如果是 X86\_64 架构,则根据有无 AVX2 指令集选择相应的包进行下载

  1. 2. 下载方式有两种,网络状态较好的情况下可以用 shell 脚本一键下载,网络状态不好的情况下使用下载链接的方式进行下载,3个二进制包都需要下载

  2. 3. 下载完成后,需要将 apache-doris-dependencies 包的 java-udf-jar-with-dependencies.jar 放到 be/lib 目录下
mv java-udf-jar-with-dependencies.jar ${DORIS_HOME}/be/lib
  1. 1. 修改 fe.conf 和 be.conf  中的 priority_networks 参数
# 先查看当前节点的内网 IP
ip addr 或者 ifconfig
# 修改 priority_networks
vim fe.conf 或者 be.conf
priority_networks=当前内网IP/32
  1. 1. 启动 FE 和 BE
sh {$DORIS_HOME}/fe/bin/start_fe.sh --daemon
sh {$DORIS_HOME}/be/bin/start_be.sh --daemon

如要完成高可用 FE 搭建,建议 1Follower 1Observer,或者 3Follower。

其中 Follower 角色提供读和写能力,Observer 只提供对外读的能力。

注意!!Follower 角色由于要进行选举,所以角色数量必须为奇数个!!!

除去刚刚启动的 FE 默认为 Follower(Master) 外,其他 Observer 或者 Follower 启动都需要遵循以下命令

# master_fe_ip 为第一台启动的 FE 节点的内网 IP 地址
sh {$DORIS_HOME}/fe/bin/start_fe.sh --helper "master_fe_ip:9010" --daemon
  1. 1. 注册非 Master FE 节点至 Master【若只有一个 FE 可跳过】可以使用 MySQL-Client、Navicat、Dbeaver 等数据库终端软件连接 Doris 集群,连接方式与连接 MySQL 方式一致,端口从 3306 改为 9030 即可以 MySQL-Client 为例
mysql -uroot -P9030 -h127.0.0.1

注册 Follower 角色

alter system add follower "需要添加的 FE 节点内网 IP:9010";

注册 Observer 角色

alter system add observer "需要添加的 FE 节点内网 IP:9010";
  1. 1. 注册 Backend以 MySQL-Client 为例
mysql -uroot -P9030 -h127.0.0.1

注册

alter system add backend "be_ip:9050";

校验

校验是否注册成功

show frontends;
show backends;

查看所有的 FE/BE 节点 alive 状态是否为 true,如果为 true 则表示注册成功。

Docker 部署

注意事项

Docker 部署当前不可以用于生产环境!

Docker 部署适用于个人/组织学习、调试BUG、测试功能等场景

部署前置工作

安装好 Docker 环境以及 Docker-compose 环境

  • • Docker:20.0+
  • • Docker-Compose:2.10+

执行以下命令完成 max_map_count 参数调整:

sysctl -w vm.max_map_count=2000000

部署流程

本篇以 1FE 1BE 为例部署,使用平台为 X86_64 平台

在 2.0 版本开始,我将会更新官方镜像,支持 hostname 配置寻址,同时解决 K8S 部署问题

最近有点忙,预计 6-15 以前搞定~

Docker 部署

  1. 1. 创建子网网桥
docker network create --driver bridge --subnet=172.20.80.0/24 doris-network
  1. 1. 执行命令
docker run -itd \
--name=fe \
--env FE_SERVERS="fe1:172.20.80.2:9010" \
--env FE_ID=1 \
-p 8030:8030 \
-p 9030:9030 \
-v /data/fe/doris-meta:/opt/apache-doris/fe/doris-meta \
-v /data/fe/log:/opt/apache-doris/fe/log \
--network=doris-network \
--ip=172.20.80.2 \
apache/doris:1.2.2-fe-x86_64

docker run -itd \
--name=be \
--env FE_SERVERS="fe1:172.20.80.2:9010" \
--env BE_ADDR="172.20.80.3:9050" \
-p 8040:8040 \
-v /data/be/storage:/opt/apache-doris/be/storage \
-v /data/be/log:/opt/apache-doris/be/log \
--network=doris-network \
--ip=172.20.80.3 \
apache/doris:1.2.2-be-x86_64

Docker-Compose 部署

  1. 1. 创建 docker-compose.yaml
version: '3'
services:
  docker-fe:
    image: "apache/doris:1.2.2-fe-x86_64"
    container_name: "doris-fe"
    hostname: "fe"
    environment:
      - FE_SERVERS=fe1:172.20.81.2:9010
      - FE_ID=1
    ports:
      - 8030:8030
      - 9030:9030
    volumes:
      - /data/fe/doris-meta:/opt/apache-doris/fe/doris-meta
      - /data/fe/log:/opt/apache-doris/fe/log
    networks:
      doris_net:
        ipv4_address: 172.20.81.2
  docker-be:
    image: "apache/doris:1.2.2-be-x86_64"
    container_name: "doris-be"
    hostname: "be"
    depends_on:
      - docker-fe
    environment:
      - FE_SERVERS=fe1:172.20.80.2:9010
      - BE_ADDR=172.20.81.3:9050
    ports:
      - 8040:8040
    volumes:
      - /data/be/storage:/opt/apache-doris/be/storage
      - /data/be/script:/docker-entrypoint-initdb.d
      - /data/be/log:/opt/apache-doris/be/log
    networks:
      doris_net:
        ipv4_address: 172.20.81.3
networks:
  doris_net:
    ipam:
      config:
        - subnet: 172.20.81.0/24
  1. 1. 执行命令
docker-compose up -d

校验

  1. 1. 查看容器是否成功创建,创建以后状态是否 RUNNING
# docker run 部署
docker ps -a
# docker-compose 部署
docker-compose ps -a
  1. 1. 使用 MySQL-Client 连接 FE
# docker run 部署
mysql -uroot -P9030 -h172.20.80.2
# docker-compose 部署
mysql -uroot -P9030 -h172.20.81.2
  1. 1. 查看 Backend 状态
show backends

快速使用

再次强调一下,连接 Doris 只需要支持 MySQL 的客户端,无需 MySQL 的服务端,这个客户端可以是 MySQL-Client 黑窗口,可以是 Navicat、Dbeaver 之类的 GUI 可视化工具,也可以是通过 JDBC-MySQL 协议通过代码进行连接,不需要再安装一个 MySQL-Server!!!

连接 Doris

mysql -uroot -P9030 -h127.0.0.1
  • • -u:当前登录用户名
  • • -P:访问 Doris 时的 MySQL 协议通讯端口
  • • -h:要访问的 Doris-FE 节点机器的 IP 地址
  • • -p:不需要填写,默认密码为空,这个参数无需填写

创建数据表

  1. 1. 创建一个数据库
create database demo;
  1. 1. 创建数据表
use demo;

CREATE TABLE IF NOT EXISTS demo.example_tbl
(
    `user_id` LARGEINT NOT NULL COMMENT "用户id",
    `date` DATE NOT NULL COMMENT "数据灌入日期时间",
    `city` VARCHAR(20) COMMENT "用户所在城市",
    `age` SMALLINT COMMENT "用户年龄",
    `sex` TINYINT COMMENT "用户性别",
    `last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间",
    `cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费",
    `max_dwell_time` INT MAX DEFAULT "0" COMMENT "用户最大停留时间",
    `min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用户最小停留时间"
)
AGGREGATE KEY(`user_id`, `date`, `city`, `age`, `sex`)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 1
PROPERTIES (
    "replication_allocation" = "tag.location.default: 1"
);
  1. 1. 示例数据
10000,2017-10-01,北京,20,0,2017-10-01 06:00:00,20,10,10
10000,2017-10-01,北京,20,0,2017-10-01 07:00:00,15,2,2
10001,2017-10-01,北京,30,1,2017-10-01 17:05:45,2,22,22
10002,2017-10-02,上海,20,1,2017-10-02 12:59:12,200,5,5
10003,2017-10-02,广州,32,0,2017-10-02 11:20:00,30,11,11
10004,2017-10-01,深圳,35,0,2017-10-01 10:00:15,100,3,3
10004,2017-10-03,深圳,35,0,2017-10-03 10:20:22,11,6,6

将上面的数据保存在test.csv文件中。

  1. 1. 导入数据

这里我们通过Stream load 方式将上面保存到文件中的数据导入到我们刚才创建的表里。

curl  --location-trusted -u root: -T test.csv -H "column_separator:," http://127.0.0.1:8030/api/demo/example_tbl/_stream_load
  • • -T test.csv : 这里使我们刚才保存的数据文件,如果路径不一样,请指定完整路径
  • • -u root : 这里是用户名密码,我们使用默认用户root,密码是空
  • • 127.0.0.1:8030 : 分别是 fe 的 ip 和 http\_port

执行成功之后我们可以看到下面的返回信息

{
    "TxnId": 30303,
    "Label": "8690a5c7-a493-48fc-b274-1bb7cd656f25",
    "TwoPhaseCommit": "false",
    "Status": "Success",
    "Message": "OK",
    "NumberTotalRows": 7,
    "NumberLoadedRows": 7,
    "NumberFilteredRows": 0,
    "NumberUnselectedRows": 0,
    "LoadBytes": 399,
    "LoadTimeMs": 381,
    "BeginTxnTimeMs": 3,
    "StreamLoadPutTimeMs": 5,
    "ReadDataTimeMs": 0,
    "WriteDataTimeMs": 191,
    "CommitAndPublishTimeMs": 175
}
  • • NumberLoadedRows: 表示已经导入的数据记录数
  • • NumberTotalRows: 表示要导入的总数据量
  • • Status :Success 表示导入成功

到这里我们已经完成的数据导入,下面就可以根据我们自己的需求对数据进行查询分析了。

查询数据

我们上面完成了建表,输数据导入,下面我们就可以体验 Doris 的数据快速查询分析能力。

mysql> select * from example_tbl;
+---------+------------+--------+------+------+---------------------+------+----------------+----------------+
| user_id | date       | city   | age  | sex  | last_visit_date     | cost | max_dwell_time | min_dwell_time |
+---------+------------+--------+------+------+---------------------+------+----------------+----------------+
| 10000   | 2017-10-01 | 北京   |   20 |    0 | 2017-10-01 07:00:00 |   35 |             10 |              2 |
| 10001   | 2017-10-01 | 北京   |   30 |    1 | 2017-10-01 17:05:45 |    2 |             22 |             22 |
| 10002   | 2017-10-02 | 上海   |   20 |    1 | 2017-10-02 12:59:12 |  200 |              5 |              5 |
| 10003   | 2017-10-02 | 广州   |   32 |    0 | 2017-10-02 11:20:00 |   30 |             11 |             11 |
| 10004   | 2017-10-01 | 深圳   |   35 |    0 | 2017-10-01 10:00:15 |  100 |              3 |              3 |
| 10004   | 2017-10-03 | 深圳   |   35 |    0 | 2017-10-03 10:20:22 |   11 |              6 |              6 |
+---------+------------+--------+------+------+---------------------+------+----------------+----------------+
6 rows in set (0.02 sec)

mysql> select * from example_tbl where city='上海';
+---------+------------+--------+------+------+---------------------+------+----------------+----------------+
| user_id | date       | city   | age  | sex  | last_visit_date     | cost | max_dwell_time | min_dwell_time |
+---------+------------+--------+------+------+---------------------+------+----------------+----------------+
| 10002   | 2017-10-02 | 上海   |   20 |    1 | 2017-10-02 12:59:12 |  200 |              5 |              5 |
+---------+------------+--------+------+------+---------------------+------+----------------+----------------+
1 row in set (0.05 sec)

mysql> select city, sum(cost) as total_cost from example_tbl group by city;
+--------+------------+
| city   | total_cost |
+--------+------------+
| 广州   |         30 |
| 上海   |        200 |
| 北京   |         37 |
| 深圳   |        111 |
+--------+------------+
4 rows in set (0.05 sec)

小结

本篇适合无脑入门,小白只需要按步骤执行,就可以完成极简集群的安装和部署,如果在过程中遇到问题,可以在Apache Doris 官方微信群里圈我,或者加我微信好友直接私聊我来协助你部署。

微信号:fl\_manyi

下一篇:《Apache Doris 夺命 30 连问!》

我们是一群由数据从业人员,因为热爱凝聚在一起,以开源精神为基础,组成的PowerData数据之力社区。可关注下方公众号后点击“加入我们”,与PowerData一起成长


PowerData
1 声望2 粉丝

PowerData社区官方思否账号