doris 部署

发布时间 2023-04-06 13:06:18作者: 赵钱富贵

doris 部署

官方文档

https://doris.apache.org/zh-CN/docs/summary/basic-summary

下载doris

uname -a 查看CPU架构信息

cat /proc/cpuinfo 查看flags中有无 avx2 ,判断是否支持

下载对应版本doris(fe 和be)

我下载的版本是: x64(avx2)-1.1.3(已编译)

部署

https://doris.apache.org/zh-CN/docs/get-starting/

各端口

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

  1. 、/etc/profile 配置环境变量 DORIS_HOME

DORIS_HOME=

PATH= DORIS_HOME:$PATH

EXPORT DORIS_HOME PATH

退出后 source /etc/profile

  1. 配置conf里的fe.conf。很多都是默认设置。修改的地方:

  2. 解注释 meta_dir =

  3. http_port = 8030。默认是8030端口

  4. priority_networks = 192.168.30.37/24。本机的ip地址。(使用 ip a查看后缀是16还是24)

  5. 在fe目录下,启动fe。

    # start_fe.sh
    观察不要出现报错即可
    
  6. 使用jps,查看是否有PaloFe进程,有则启动成功。

  7. 使用MySQL client连接。可在fe.conf里看默认的端口号(query_port = 9030)

    mysql -h 192.168.x.x -P9030 -uroot
    
  8. 连接成功,则查询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配置

  1. 【BE】配置环境变量 DORIS_BE_HOME。

  2. 【BE】修改conf里的be.conf配置文件。

    storage_root_path = ${DORIS_BE_HOME}/storage;
    priority_networks = 192.168.xx.xx/24(可通过ip a查看本机的priority_networks)
    
  3. 【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";

  4. 【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");


  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");