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
  1. 软件需求
# 查看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条件,缩短单次导入的数据量,是可以进行导入的,但是其中一年的数据,如果手动逐步修改条件,难度太大。后来采用程序写定时任务循环导入了,指定好要导入的时间范围,再次范围内按天循环,在一天内又按几个小时一个批次循环,最终将数据导入到本地表中。

posted @ 2023-06-12 09:03  哈喽哈喽111111  阅读(4086)  评论(0编辑  收藏  举报