Doris实战:安装部署篇
转载自:https://zhuanlan.zhihu.com/p/557072995
Doris简介
Apache Doris(原百度 Palo)是一个基于 MPP 架构的高性能、实时的分析型数据库,由百度在 2017 年开源,2018 年 8月 进入 Apache 孵化器。
产品特性
- MPP分布式执行框架:在 MPP 执行框架中,一条查询请求会被拆分成多个物理计算单元,在多机并行执行。
- 全面向量化执行引擎:全面向量化引擎按照列式的方式组织和处理数据,充分发挥了CPU的处理能力。
- CBO 优化器:基于代价的优化器CBO(Cost Based Optimizer),StarRocks能比同类产品更好地支持多表关联查询,特别是复杂的多表关联查询,让全面向量化引擎能够发挥极致的性能。
- 可实时更新的列式存储引擎:在列式存储引擎中,数据以按列的方式进行存储;支持秒级的导入延迟,提供准实时的服务能力。
- 智能的物化视图:支持用户使用物化视图实现查询加速。不同于一些同类产品的物化视图需要异步和原表做数据同步,StarRocks的物化视图可以自动根据原始表更新数据。
软硬件选择
软件版本: Doris 1.2.4.1 下载地址
在linux环境下通过wget下载,速度非常慢,windows环境下,通过下载工具下载,速度快了很多,也可能是网络原因。
服务器配置:
官方建议:通常建议 10 ~ 100 台左右的机器,来充分发挥 Doris 的性能(其中 3 台部署 FE(HA),剩余的部署 BE)在最少4台机器(一台 FE,三台 BE,其中一台 BE 混部一个 Observer FE 提供元数据备份),以及较低配置的情况下,依然可以平稳的运行 Doris。
安装需求
1.Linux 操作系统版本需求
# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
1)设置系统最大打开文件句柄数
# vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
2)时钟同步
Doris 的元数据要求时间精度要小于5000ms,所以所有集群所有机器要进行时钟同步,避免因为时钟问题引发的元数据不一致导致服务出现异常。
3)关闭交换分区(swap)
Linux交换分区会给Doris带来很严重的性能问题,需要在安装之前禁用交换分区。
# 使用不重启的方式,禁用swap,立即生效
# swapoff -a
# sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
4)Liunx文件系统
这里我们推荐使用ext4文件系统,在安装操作系统的时候,请选择ext4文件系统。
# df -hT
- 软件需求
# 查看GCC版本(>=4.8.2)
# gcc -v
gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
# 安装并查看JAVA版本(>=1.8)
# java -version
java version "1.8.0_202"
集群部署
采用集群部署,所以每台服务器都需要上传解压。
FE部署
1)拷贝 FE 部署文件到指定节点
# 1. 创建目录
mkdir -p /opt/software
mkdir -p fe /home/doris/
cd /opt/software
# 2. 解压压缩包
tar -xvf apache-doris-1.2.4.1-bin-x86-jdk8.tar
cd apache-doris-1.2.4.1-bin-x86-jdk8/
# 3. 移动fe文件夹至/home/doris/目录下去
mv fe /home/doris/
2)配置FE
# 配置 FE-Config
vi fe/conf/fe.conf
# 取消 priority_networks 的注释,修改参数
# 例如当前节点的 IP 地址为 10.10.2.21,则需要更改为 10.10.2.0/24 填入
# 这里需要填入的是 IP 子网网段地址,并非 IP 地址
priority_networks = 10.10.2.0/24
# 保存退出
3)启动 FE
在 FE 安装目录下执行下面的命令,来完成 FE 的启动。
./bin/start_fe.sh --daemon
查看 FE 运行状态
curl http://127.0.0.1:8030/api/bootstrap
这里 IP 和 端口分别是 FE 的 IP 和 http_port(默认8030),如果是在 FE 节点执行,直接运行上面的命令即可。如果返回结果中带有 "msg":"success" 字样,则说明启动成功。
4)连接 FE
通过下载免安装的 MySQL 客户端(mysql-client)来连接 Doris FE。
解压刚才下载的 MySQL 客户端,在 bin/ 目录下可以找到 mysql 命令行工具。然后执行下面的命令连接 Doris。
mysql -uroot -P9030 -h127.0.0.1
查看 FE 运行状态(如果 IsMaster、Join 和 Alive 三列均为true,则表示节点正常)
SHOW FRONTENDS\G;
5)停止FE
在 FE 安装目录下执行下面的命令,来完成 FE 的停止。
./bin/stop_fe.sh
BE部署
1)拷贝 BE 部署文件到指定节点
# 1. 创建目录
mkdir -p /opt/software
mkdir -p be /home/doris/
cd /opt/software
# 2. 解压压缩包
tar -xvf apache-doris-1.2.4.1-bin-x86-jdk8.tar
cd apache-doris-1.2.4.1-bin-x86-jdk8/
# 3. 移动be文件夹至/home/doris/目录下去
mv be /home/doris/
2)配置BE
# 配置 BE-Config
vi be/conf/be.conf
# 取消 priority_networks 的注释,修改参数
# 例如当前节点的 IP 地址为 10.10.2.21,则需要更改为 10.10.2.0/24 填入
# 这里需要填入的是 IP 子网网段地址,并非 IP 地址
priority_networks = 10.10.2.0/24
# 保存退出
3)启动 BE
在 BE 安装目录下执行下面的命令,来完成 BE 的启动。
./bin/start_be.sh --daemon
查看 BE 运行状态
curl http://127.0.0.1:8040/api/health
如果返回: {"status": "OK","msg": "To Be Added"} 则表示启动成功,其余情况,则可能存在问题。
4)注册BE
通过免安装的 MySQL 客户端连接 Doris FE,执行以下命令来添加每一个 BE:
ALTER SYSTEM ADD BACKEND "BE_IP:9050";
查看 BE 运行状态
SHOW PROC '/backends'\G;
5)停止BE
在 BE 安装目录下执行下面的命令,来完成 BE 的停止。
./bin/stop_be.sh
配置环境变量
# vim /etc/profile.d/doris.sh
#!/bin/bash
export DORIS_HOME=/home/doris/
export PATH=$PATH:$DORIS_HOME/fe/bin:$DORIS_HOME/be/bin
# source /etc/profile.d/doris.sh
访问
启动后可以通过mysql客户端或者浏览器进行访问了
浏览器访问
输入用户名,进行登录(内置root用户,密码默认为空)。
找到system->backends
如果能够看到be,并且alive状态为true,说明be以及添加到集群,并且处于活跃状态。
如果没有任何be,则需要执行sql语句进行添加。
mysql -h FE_IP -P 9030 -uroot
# 注册 BE
ALTER SYSTEM ADD BACKEND "BE_IP:9050";
错误汇总
1.启动失败
启动be失败,查看日志出现了如下的错误
CPU does not support AVX2 instruction set
由于CPU不支持avx2指令集,建议从源码包重新build,指定特定的参数。或者下载支持avx2指令集的安装包。
查看是否支持avx2指令,如果有输出信息,则说明支持avx2指令集。
# cat /proc/cpuinfo |grep avx2
2.创建mysql外部表失败
测试性能首先需要创建表,导入大量的数据,这里采用的方法是,先创建一个mysql的外部表,然后再创建一个本地表,然后从外部表导入数据到本地表,再在本地表执行相关的查询等操作,看看性能和效率情况。
首先是创建资源:
CREATE EXTERNAL RESOURCE `mysql_odbc`
PROPERTIES (
"type" = "odbc_catalog",
"host" = "192.168.0.180",
"port" = "3306",
"user" = "root",
"password" = "password",
"database" = "dbname",
"odbc_type" = "mysql",
"driver" = "MySQL"
提示找不到mysql的odbc驱动。经过查找资料,发现是需要安装mysql的odbc驱动。于是到官网下载mysql驱动。
下载8.0.30版本出现如下错误:
SSL connection error: Failed to set ciphers to use (2026)
下载8.0.27,下载地址:https://cdn.mysql.com/archives/mysql-connector-odbc-8.0/mysql-connector-odbc-8.0.27-linux-glibc2.12-x86-64bit.tar.gz
下载后,进行加压:
解压
tar -zxvf mysql-connector-odbc-8.0.27-linux-glibc2.12-x86-64bit.tar.gz
在be的配置目录下的odbcinst.ini文件中,添加如下配置:
# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[MySQL ODBC 8.0 Unicode Driver]
Description = ODBC for MySQL
Driver = /home/mysql-odbc-driver/lib/libmyodbc8w.so
FileUsage = 1
然后,重启be,重新创建外部资源,修改驱动名称。
CREATE EXTERNAL RESOURCE `mysql_odbc`
PROPERTIES (
"type" = "odbc_catalog",
"host" = "192.168.0.180",
"port" = "3306",
"user" = "root",
"password" = "password",
"database" = "dbname",
"odbc_type" = "mysql",
"driver" = "MySQL ODBC 8.0 Unicode Driver"
);
在外部资源的基础上,创建外部表。
create EXTERNAL table ext_bill_2020y
(
`bill_id` varchar(32) NOT NULL ,
`merchant_no` varchar(32) DEFAULT NULL ,
`bill_no` varchar(64) DEFAULT NULL ,
`bill_date` datetime DEFAULT NULL
)
ENGINE=ODBC
PROPERTIES (
"odbc_catalog_resource" = "mysql_odbc",
"database" = "box",
"table" = "bill_2020y"
);
创建成功后,就可以像访问本地方法一下进行查询操作了。
3.创建本地表失败
doris中创建本地表,虽然和mysql有类似的地方,但是,也有比较多不一样的地方。
create table bill_2020y
(
`bill_id` varchar(32) NOT NULL ,
`merchant_no` varchar(32) DEFAULT NULL ,
`bill_no` varchar(64) DEFAULT NULL ,
`bill_date` datetime DEFAULT NULL
) ENGINE=OLAP
DUPLICATE KEY(bill_id)
PARTITION BY RANGE(bill_date)(
)
DISTRIBUTED BY HASH(bill_id) BUCKETS 10
PROPERTIES
(
"replication_num" = "1",
"dynamic_partition.enable" = "true",
"dynamic_partition.create_history_partition" = "true",
"dynamic_partition.history_partition_num" = "21",
"dynamic_partition.time_unit" = "MONTH",
"dynamic_partition.start" = "-24",
"dynamic_partition.end" = "1",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "10"
);
这里需要指定表类型,以下简要说明:
Aggregate 模型:聚合模型,可以根据业务需要,配置成导入数据聚合,保留明细数据,导入数据与已有数据聚合。
Unique 模型:主键唯一模型,在某些多维分析场景下,用户更关注的是如何保证 Key 的唯一性,即如何获得 Primary Key 唯一性约束。因此,我们引入了 Unique 的数据模型。该模型本质上是聚合模型的一个特例,也是一种简化的表结构表示方式。
Duplicate 模型:可重复模型,在某些多维分析场景下,数据既没有主键,也没有聚合需求。因此,我们引入 Duplicate 数据模型来满足这类需求。
只有一个节点的情况下,需要指定参数"replication_num" = "1",否则会出现建表失败。
Key columns should be a ordered prefix of the schema.
以上错误提示,表示关键列应放在表定义的前面。
这里用到动态分区配置,建表时根据配置的参数创建一定的分区。
4.创建本地表失败
添加数据时,出现下面的提示:
data cannot be inserted into table with empty partition.
以上提示,表示数据对于的分区没有创建,无法写入数据。应调整建表参数,确保写入数据的分区在写入数据以前提前创建好。
查看分区
SHOW PARTITIONS FROM bill_2020y;
查看分区表
SHOW DYNAMIC PARTITION TABLES;
5.导入数据失败
insert into bill_2020y select * from ext_bill_2020y;
从外部表导入数据到本地表,由于外部表中数据5000多万条,数据量比较大,使用该语句导致sql执行超时都无法完成。后面尝试过添加where条件,缩短单次导入的数据量,是可以进行导入的,但是其中一年的数据,如果手动逐步修改条件,难度太大。后来采用程序写定时任务循环导入了,指定好要导入的时间范围,再次范围内按天循环,在一天内又按几个小时一个批次循环,最终将数据导入到本地表中。