doris 部署
doris 部署
官方文档
https://doris.apache.org/zh-CN/docs/summary/basic-summary
下载doris
uname -a
查看CPU架构信息
cat /proc/cpuinfo
查看flags中有无 avx2 ,判断是否支持
我下载的版本是: x64(avx2)-1.1.3(已编译)
部署
各端口
fe :
8030 http端口
9010 编辑日志 端口
9020 rpc端口
9030 query端口(mysql-client)
be :
9050 心跳检测服务端口
9060 be端口
8040 webservice端口 8040
8060 brpc_port (改为8070)
1、java8环境
2、直接下载编译好的二进制文件,进行解压
3、 查看电脑的open file的大小,
如果是1024则要设置大,否则在运行be时,输入be/bin/start.sh会提示报错:fail to open storageEngine,res=file descriptors limit is too small
(1)首先通过ulimit -a查看系统的一些参数设置
(2)设置open files参数
####如下是永久的修改
vim /etc/profile
在文件末尾加入
ulimit –n 65535
退出后
source /etc/profile
FE的配置
单个配置fe.conf
- 、/etc/profile 配置环境变量 DORIS_HOME
DORIS_HOME=
PATH= DORIS_HOME:$PATH
EXPORT DORIS_HOME PATH
退出后 source /etc/profile
-
配置conf里的fe.conf。很多都是默认设置。修改的地方:
-
解注释
meta_dir =
-
http_port = 8030
。默认是8030端口 -
priority_networks = 192.168.30.37/24
。本机的ip地址。(使用ip a
查看后缀是16还是24) -
在fe目录下,启动fe。
# start_fe.sh 观察不要出现报错即可
-
使用jps,查看是否有PaloFe进程,有则启动成功。
-
使用MySQL client连接。可在fe.conf里看默认的端口号(query_port = 9030)
mysql -h 192.168.x.x -P9030 -uroot
-
连接成功,则查询fe节点。alive=true则成功。
SHOW PROC '/frontends'\G
10.dors界面 http://fe_ip:8030/ 账号root 密码为空
修改密码
SET PASSWORD FOR 'root' = PASSWORD('Sft@123456');
集群版本的FE见此文档:https://blog.csdn.net/longqiancao1/article/details/117665789
BE配置
-
【BE】配置环境变量 DORIS_BE_HOME。
-
【BE】修改conf里的be.conf配置文件。
storage_root_path = ${DORIS_BE_HOME}/storage; priority_networks = 192.168.xx.xx/24(可通过ip a查看本机的priority_networks)
-
【BE】启动be。start_be.sh --daemon (--daemon在后台启动)
【FE的节点上操作】mysql -h 192.168.30.37-P9030 -uroot 进入mysql;添加backend信息。
#添加BE节点到FE ALTER SYSTEM ADD BACKEND "192.168.30.40:9050";
ALTER SYSTEM ADD BACKEND "192.168.30.41:9050";
ALTER SYSTEM ADD BACKEND "192.168.30.42:9050";
#如不小心填错了,可用这个删除:
alter system decommission backend "192.168.30.40:9050";
-
【FE】查看be状态。SHOW PROC '/backends'\G。如果alive=true,则启动成功
使用
进入 doris 界面(http://fe_ip/8030)playgroud 下的sql界面
建表
直接创建,csv导入
CREATE TABLE IF NOT EXISTS tb1
(
`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(`create_time`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 1");
- csv 格式
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
(1)Stream load 导入(dos 和shell 都可)
curl --location-trusted -u root: -T test.txt -H "column_separator:," http://192.168.1.49:8030/api/db1/tb1/_stream_load
curl --location-trusted -u es: -T test.txt -H "column_separator:," http://172.31.100.2:8030/api/db1/tb1/_stream_load
(2)playgroud/选择数据库/data import 选择文件导入
通过外部表导入
在所有be节点 , 安装mysql ODBC
修改conf/odbcinst.ini
[MySQL ODBC 8.0.28 Unicode Driver]
Description = ODBC for MySQL
Driver = /home/mysql-odbc-8.0.28/lib/libmyodbc8w.so #你的odbc安装目录
FileUsage = 1
## 注意: 去掉键、 mediumtext,timestamp
CREATE EXTERNAL table `ext_risk_info`(
`id` bigint(20) NOT NULL ,
`specialist_id` bigint(20) NOT NULL DEFAULT '0' ,
`company_id` varchar(20) NOT NULL DEFAULT '' ,
`attach_id` bigint(20) NOT NULL DEFAULT '0' ,
`user_id` bigint(20) NOT NULL DEFAULT '0' ,
`content` text ,
`suggestion` text ,
`standard_info` text ,
`status` tinyint(3) NOT NULL DEFAULT '0' ,
`create_time` datetime NOT NULL ,
`update_time` datetime NOT NULL ,
`specialist_name` varchar(50) DEFAULT '' ,
`city` varchar(20) DEFAULT NULL ,
`is_deleted` tinyint(1) NOT NULL DEFAULT '0' ,
`first_class_code` varchar(10) DEFAULT NULL ,
`first_class_name` varchar(50) DEFAULT NULL ,
`company_name` varchar(200) DEFAULT NULL ,
`third_code` varchar(10) DEFAULT NULL ,
`third_name` varchar(500) DEFAULT NULL ,
`second_code` varchar(10) DEFAULT NULL ,
`region` varchar(500) DEFAULT NULL ,
`four_class` tinyint(1) DEFAULT '0' ,
`danger_class` varchar(255) DEFAULT NULL ,
`is_danger` tinyint(1) DEFAULT '0' ,
`second_name` varchar(255) DEFAULT NULL ,
`region_code` varchar(20) DEFAULT NULL ,
`stand_desc` text ,
`basis` text ,
`attach_list_id` varchar(200) DEFAULT NULL ,
`task_id` bigint(20) DEFAULT NULL ,
`penalty` text ,
`discretion` text ,
`reform_status` char(1) DEFAULT NULL ,
`device` varchar(600) DEFAULT NULL ,
`danger` tinyint(1) DEFAULT '0' ,
`workmanship` varchar(600) DEFAULT NULL ,
`installation` varchar(600) DEFAULT NULL ,
`taskwork` varchar(800) DEFAULT NULL ,
`worker` varchar(3000) DEFAULT NULL ,
`area` varchar(1000) DEFAULT NULL ,
`danger_chemical` varchar(1000) DEFAULT NULL ,
`workplace` varchar(500) DEFAULT NULL ,
`industry_id` int(11) DEFAULT NULL ,
`check_time` datetime NULL DEFAULT NULL ,
`law` text ,
`risk_source` text ,
`risk_level` varchar(20) DEFAULT NULL ,
`risk_level_id` tinyint(3) DEFAULT NULL ,
`check_start` datetime NULL DEFAULT NULL ,
`check_end` datetime NULL DEFAULT NULL ,
`attribution` varchar(255) DEFAULT NULL ,
`attribution_code` tinyint(4) DEFAULT NULL ,
`region_map_code` varchar(20) DEFAULT NULL ,
`trick` tinyint(4) DEFAULT '0' ,
`major_danger_level_id` int(11) DEFAULT NULL ,
`processes_id` int(11) DEFAULT NULL ,
`risk_position` varchar(200) DEFAULT NULL ,
`major_danger_place` varchar(200) DEFAULT NULL ,
`processes_device` varchar(200) DEFAULT NULL ,
`industry_code` varchar(8) DEFAULT NULL ,
`industry_name` varchar(50) DEFAULT NULL ,
`sub_industry_name` varchar(50) DEFAULT NULL
)
ENGINE=mysql
PROPERTIES (
"host" = "192.168.1.49",
"port" = "3306",
"user" = "root",
"password" = "123456",
"database" = "bigdata_core",
"table" = "risk_info",
"charset"="utf8mb4"
);
创建 doris表
CREATE table `risk_info_u`(
`id` bigint(20) NOT NULL ,
`specialist_id` bigint(20) NOT NULL DEFAULT '0' ,
`company_id` varchar(20) NOT NULL DEFAULT '' ,
`attach_id` bigint(20) NOT NULL DEFAULT '0' ,
`user_id` bigint(20) NOT NULL DEFAULT '0' ,
`content` text ,
`suggestion` text ,
`standard_info` text ,
`status` tinyint(3) NOT NULL DEFAULT '0' ,
`create_time` datetime NOT NULL ,
`update_time` datetime NOT NULL ,
`specialist_name` varchar(50) DEFAULT '' ,
`city` varchar(20) DEFAULT NULL ,
`is_deleted` tinyint(1) NOT NULL DEFAULT '0' ,
`first_class_code` varchar(10) DEFAULT NULL ,
`first_class_name` varchar(50) DEFAULT NULL ,
`company_name` varchar(200) DEFAULT NULL ,
`third_code` varchar(10) DEFAULT NULL ,
`third_name` varchar(500) DEFAULT NULL ,
`second_code` varchar(10) DEFAULT NULL ,
`region` varchar(500) DEFAULT NULL ,
`four_class` tinyint(1) DEFAULT '0' ,
`danger_class` varchar(255) DEFAULT NULL ,
`is_danger` tinyint(1) DEFAULT '0' ,
`second_name` varchar(255) DEFAULT NULL ,
`region_code` varchar(20) DEFAULT NULL ,
`stand_desc` text ,
`basis` text ,
`attach_list_id` varchar(200) DEFAULT NULL ,
`task_id` bigint(20) DEFAULT NULL ,
`penalty` text ,
`discretion` text ,
`reform_status` char(1) DEFAULT NULL ,
`device` varchar(600) DEFAULT NULL ,
`danger` tinyint(1) DEFAULT '0' ,
`workmanship` varchar(600) DEFAULT NULL ,
`installation` varchar(600) DEFAULT NULL ,
`taskwork` varchar(800) DEFAULT NULL ,
`worker` varchar(3000) DEFAULT NULL ,
`area` varchar(1000) DEFAULT NULL ,
`danger_chemical` varchar(1000) DEFAULT NULL ,
`workplace` varchar(500) DEFAULT NULL ,
`industry_id` int(11) DEFAULT NULL ,
`check_time` datetime NULL DEFAULT NULL ,
`law` text ,
`risk_source` text ,
`risk_level` varchar(20) DEFAULT NULL ,
`risk_level_id` tinyint(3) DEFAULT NULL ,
`check_start` datetime NULL DEFAULT NULL ,
`check_end` datetime NULL DEFAULT NULL ,
`attribution` varchar(255) DEFAULT NULL ,
`attribution_code` tinyint(4) DEFAULT NULL ,
`region_map_code` varchar(20) DEFAULT NULL ,
`trick` tinyint(4) DEFAULT '0' ,
`major_danger_level_id` int(11) DEFAULT NULL ,
`processes_id` int(11) DEFAULT NULL ,
`risk_position` varchar(200) DEFAULT NULL ,
`major_danger_place` varchar(200) DEFAULT NULL ,
`processes_device` varchar(200) DEFAULT NULL ,
`industry_code` varchar(8) DEFAULT NULL ,
`industry_name` varchar(50) DEFAULT NULL ,
`sub_industry_name` varchar(50) DEFAULT NULL
)
unique key(id)
DISTRIBUTED BY HASH(id) BUCKETS 2
PROPERTIES (
"replication_num" = "1"
);
insert into risk_info_u select * from ext_risk_info
理论
数据模型
-
(1)Aggregate(聚合模型)
-
(2)Unique
-
(3)Duplicate
结论:
Aggregate 模型可以通过预聚合,极大地降低聚合查询时所需扫描的数据量和查询的计算量,非常适合有固定模式的报表类查询场景。
Unique 可以保证主键唯一性约束,但本质是 REPLACE,没有 SUM 这种聚合方式。
Duplicate 适合任意维度的 Ad-hoc 查询
(1)Aggregate
业务数据表如下
指定
聚合方式
(AggregationType)的为指标
字段(value)其余的为
维度
(key)字段 AGGREGATE KEY(user_id
,date
,city
,age
,sex
)ColumnName Type AggregationType Comment user_id LARGEINT 用户id date DATE 数据灌入日期 city VARCHAR(20) 用户所在城市 age SMALLINT 用户年龄 sex TINYINT 用户性别 last_visit_date DATETIME REPLACE 用户最后一次访问时间 cost BIGINT SUM 用户总消费 max_dwell_time INT MAX 用户最大停留时间 min_dwell_time INT MIN 用户最小停留时间 -
(2)Unique
一种特殊的聚合模型
CREATE TABLE IF NOT EXISTS tb2 ( `user_id` LARGEINT NOT NULL COMMENT "用户id", `username` VARCHAR(50) NOT NULL COMMENT "用户昵称", `city` VARCHAR(20) COMMENT "用户所在城市", `age` SMALLINT COMMENT "用户年龄", `sex` TINYINT COMMENT "用户性别", `phone` LARGEINT COMMENT "用户电话", `address` VARCHAR(500) COMMENT "用户地址", `register_time` DATETIME COMMENT "用户注册时间" ) UNIQUE KEY(`user_id`, `username`) DISTRIBUTED BY HASH(`user_id`) BUCKETS 1 PROPERTIES ( "replication_allocation" = "tag.location.default: 1" );
相当于
ColumnName Type AggregationType Comment user_id BIGINT 用户id username VARCHAR(50) 用户昵称 city VARCHAR(20) REPLACE 用户所在城市 age SMALLINT REPLACE 用户年龄 sex TINYINT REPLACE 用户性别 phone LARGEINT REPLACE 用户电话 address VARCHAR(500) REPLACE 用户住址 register_time DATETIME REPLACE 用户注册时间
(3) DUPLICATE 数据完全按照导入文件中的数据进行存储,不会有任何聚合
-- 用来指明底层数据按照那些列进行排序
DUPLICATE KEY(`timestamp`, `type`)
数据划分
基本概念
Row & Column
- Row:即用户的一行数据;
- Column: 分为Key 和 Value 可以分别对应维度列和指标列
Tablet & Partition
每个 Tablet 包含若干数据行,物理上独立存储。
分区(Partition):多个 Tablet 在逻辑上归属于不同的分区
分区和分桶
Doris 支持两层的数据划分。
第一层是 Partition,支持 Range 和 List 的划分方式。
第二层是 Bucket(Tablet),仅支持 Hash 的划分方式。
-
PARTITION
- range
PARTITION BY RANGE(`date`) ( PARTITION `p201701` VALUES LESS THAN ("2017-02-01"), PARTITION `p201702` VALUES LESS THAN ("2017-03-01"), PARTITION `p201703` VALUES LESS THAN ("2017-04-01") )
- list
PARTITION BY LIST(`city`) ( PARTITION `p_cn` VALUES IN ("Beijing", "Shanghai", "Hong Kong"), PARTITION `p_usa` VALUES IN ("New York", "San Francisco"), PARTITION `p_jp` VALUES IN ("Tokyo") )
其他
安装mysql ODBC
1、下载
wget https://downloads.mysql.com/archives/get/p/10/file/mysql-connector-odbc-8.0.28-linux-glibc2.12-x86-64bit.tar.gz
2、解压、安装
tar -zxvf mysql-connector-odbc-8.0.28-linux-glibc2.12-x86-64bit.tar.gz
mv mysql-connector-odbc-8.0.28-linux-glibc2.12-x86-64bit mysql-odbc-8.0.28
cd mysql-odbc-8.0.28/bin
##查看myodbc路径
pwd
./myodbc-installer -a -d -n "MySQL ODBC 8.0.28 Unicode Driver" -t "Driver=myodbc路径/lib/libmyodbc8w.so"
./myodbc-installer -a -d -n "MySQL ODBC 8.0.28 ANSI Driver" -t "Driver=myodbc路径/lib/libmyodbc8a.so"
## 报错: ./myodbc-installer: error while loading shared libraries: libodbc.so.2: cannot open shared object file: No such file or directory
## 解决:yum install -y unixODBC
./myodbc-installer -a -d -n "MySQL ODBC 8.0.28 Unicode Driver" -t "Driver=/home/mysql-odbc-8.0.28/lib/libmyodbc8w.so"
./myodbc-installer -a -d -n "MySQL ODBC 8.0.28 ANSI Driver" -t "Driver=/home/mysql-odbc-8.0.28/lib/libmyodbc8a.so"
3.查看是否安装成功
./myodbc-installer -d -l
4.mysql odbc 测试
vi /etc/odbc.ini
[mysql]
Driver = MySQL ODBC 8.0.27 Unicode Driver
Description = MyODBC 8.0.27 Driver
SERVER = 192.168.1.49 #要连接的数据库信息
PORT = 3306
USER = root
Password = 123456
Database = bigdata_core
OPTION = 3
charset=UTF8
isql -v mysql
踩坑
-
backend ip saved in master does not equal to backend local ip192.168.1.49 vs. 192.168.1.95
-
Failed to find 1 backends for policy: cluster|query|load|schedule|tags|medium: default_cluster|false|false|true|[{"location" : "default"}]|HDD
BE节点少于3个的且未指定副本数时 会报以上错误。一种时增加BE节点数,另一种方式时创建表里设置副本数参数。
注意事项
关键字注意
(1)mysql5及以上varchar 指的是字符
doris中varchar指字节,insert 不成功时 注意下修改varchar长度(只能改大)
(2)COMMENT ""表注释要放在key之后
(3)id字段放在前面
(4)不识别的mysql关键字
auto_increment 去掉
DEFAULT CURRENT_datetime ON UPDATE CURRENT_datetime去掉
DEFAULT CURRENT_datetime ON UPDATE CURRENT_datetime去掉
NOT NULL 去掉
mediumText 换成text
timestamp 换成datetime
建表DDL 注意
1.模型选择
只有unique 模型支持更新操作。
unique KEY(id)
2.分区和分桶
(1)企业、隐患、及其关联表(relation) 使用id分区,分桶数(BUCKET)为10
DISTRIBUTED BY HASH(id
) BUCKETS 10
(2)字典表根据id分区,分桶数为1
DISTRIBUTED BY HASH(id
) BUCKETS 1
3.副本数暂时指定为1,之后BE数量多可以修改
PROPERTIES ("replication_allocation" = "tag.location.default: 1");
unique KEY(id)
DISTRIBUTED BY HASH(id
) BUCKETS 1
PROPERTIES ("replication_allocation" = "tag.location.default: 1");