了解到doris作为百度推出的分析型数据库,据文档说明,能够兼容mysql的操作,甚至客户端完全可以使用mysql客户端连接服务器进行操作。具体情况怎样,搭建一个基本环境来测试一下。
官网参考地址:Home - Apache Doris
cd /opt
mkdir doris
cd doris
wget https://archive.apache.org/dist/doris/1.1/1.1.0-rc05/apache-doris-1.1.0-bin-x86-jdk8.tar.gz
在linux环境下通过wget下载,速度非常慢,windows环境下,通过下载工具下载,速度快了很多,也可能是网络原因。
tar -zxvf apache-doris-1.1.0-bin-x86-jdk8.tar.gz
mv apache-doris-1.1.0-bin-x86-jdk8 doris
修改为较短的目录,主要是为了后续操作方便一些。
vi fe/conf/fe.conf
priority_networks = 192.168.0.0/16
vi be/conf/be.conf
priority_networks = 192.168.0.0/16
这里根据具体的环境进行修改,确保ip地址在对应的网段范围内。
vim /etc/profile.d/doris.sh
export DORIS_HOME=/opt/doris
export PATH=$PATH:$DORIS_HOME/fe/bin:$DORIS_HOME/be/bin
source /etc/profile.d/doris.sh
./fe/bin/start_fe.sh --daemon
./be/bin/start_be.sh --daemon
如果正常情况下,这样就完成的基本部署了。可以通过mysql客户端或者浏览器进行访问了。
输入用户名,进行登录。找到system->backends
如果能够看到be,并且alive状态为true,说明be以及添加到集群,并且处于活跃状态。
如果没有任何be,则需要执行sql语句进行添加。
mysql -h FE_IP -P 9030 -uroot
# 注册 BE
ALTER SYSTEM ADD BACKEND "BE_IP:9050";
理想情况下,部署完就可以开始进行测试了,然后现实情况却不是这样的,可能会碰到各种问题等待去解决。
启动be失败,查看日志出现了如下的错误。
CPU does not support AVX2 instruction set
由于CPU不支持avx2指令集,建议从源码包重新build,指定特定的参数。过程可能比较复杂,这里放弃,寻找支持avx2指令的机器。
查看是否支持avx2指令
cat /proc/cpuinfo |grep avx2
如果有输出信息,则说明支持avx2指令集。
在新的机器上重复前面的部署过程。
测试性能首先需要创建表,导入大量的数据,这里采用的方法是,先创建一个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"
);
创建成功后,就可以像访问本地方法一下进行查询操作了。
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.
以上错误提示,表示关键列应放在表定义的前面。
这里用到动态分区配置,建表时根据配置的参数创建一定的分区。
添加数据时,出现下面的提示:
data cannot be inserted into table with empty partition.
以上提示,表示数据对于的分区没有创建,无法写入数据。应调整建表参数,确保写入数据的分区在写入数据以前提前创建好。
查看分区
SHOW PARTITIONS FROM bill_2020y;
查看分区表
SHOW DYNAMIC PARTITION TABLES;
insert into bill_2020y select * from ext_bill_2020y;
从外部表导入数据到本地表,由于外部表中数据5000多万条,数据量比较大,使用该语句导致sql执行超时都无法完成。后面尝试过添加where条件,缩短单次导入的数据量,是可以进行导入的,但是其中一年的数据,如果手动逐步修改条件,难度太大。后来采用程序写定时任务循环导入了,指定好要导入的时间范围,再次范围内按天循环,在一天内又按几个小时一个批次循环,最终将数据导入到本地表中。