心之所向,剑之所往
文章目录
- 1、Doris简介
-
- [1.1 快速开始](#1.1 快速开始)
- [1.2 安装配置](#1.2 安装配置)
-
- [1.2.1 应知前提](#1.2.1 应知前提)
- [1.2.2 配置Doris](#1.2.2 配置Doris)
-
- [1.2.2.0 配置前提](#1.2.2.0 配置前提)
- [1.2.2.1 配置FE(Frontend)](#1.2.2.1 配置FE(Frontend))
- [1.2.2.2 启动FE](#1.2.2.2 启动FE)
- [1.2.2.3 连接FE](#1.2.2.3 连接FE)
- [1.2.2.4 停止FE](#1.2.2.4 停止FE)
- [1.2.2.5 配置BE(Backend)](#1.2.2.5 配置BE(Backend))
- [1.2.2.6 启动BE](#1.2.2.6 启动BE)
- 2、操作Doris
-
- [2.1 创建表](#2.1 创建表)
- [2.2 导入数据](#2.2 导入数据)
- [3、 端口小总结](#3、 端口小总结)
- [4、 利用MySQL客户端连接Doris的原理](#4、 利用MySQL客户端连接Doris的原理)
- [5、 Doris架构](#5、 Doris架构)
-
- [5.1 Doris处理任务的流程](#5.1 Doris处理任务的流程)
- [5.2 数据模型](#5.2 数据模型)
-
- [5.2.1 Aggregate模型](#5.2.1 Aggregate模型)
- [5.2.2 Unique模型](#5.2.2 Unique模型)
-
- [5.2.2.1 读时合并](#5.2.2.1 读时合并)
- [5.2.2.2 写时合并](#5.2.2.2 写时合并)
- [5.2.3 Duplicate模型](#5.2.3 Duplicate模型)
- [5.2.4 无排序的Duplicate模型](#5.2.4 无排序的Duplicate模型)
1、Doris简介
1.1 快速开始
Apache Doris是基于MPP (Massively Parallel Processing大规模并行处理)架构的高性能、实时 的分析性数据库 ,以极速易用的特点被人熟知,仅仅需亚秒级响应 时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。基于此,Apache Doris 能够较好的满足报表分析 、即席查询 、统一数仓构建 、数据湖联邦查询加速等使用场景,用户可以在此之上构建用户行为分析、AB 实验平台、日志检索分析、用户画像分析、订单分析等应用。
1.2 安装配置
1.2.1 应知前提
1、Doris是运行在Linux环境中,推荐CentOS 7.x 或者 Ubuntu 16.04 以上版本,同时你需要安装 Java 运行环境(JDK版本要求为8)。
2、Doris没有可以直接安装安装包,是二进制的版本,因为有部分组件是利用C++写的,要进行编译之后才能安装。
1.2.2 配置Doris
1.2.2.0 配置前提
1、获取二进制安装包(自行去官网下载)。
2、利用 tar xf 解压二进制安装包到自己的目录下(要记住,等下要用)。
1.2.2.1 配置FE(Frontend)
0、进入到安装包目录下的fe目录下的conf目录下(这里就是有FE组件的配置文件fe.conf)。
1、添加priority_networks参数(默认值是0.0.0.0 就是所有客户端都可以访问)
priority_networks=172.23.16.0/24。
作用:只接受该网段的ip访问,可以提高集群的安全性。
2、 添加元数据目录(默认是FE 安装目录下的 doris-meta)
meta_dir=/path/your/doris-meta。
作用:配置你自己想要的位置。
注意:如果需要自己设置元数据的目录,在启动fe之前要保证目录已经存在。
1.2.2.2 启动FE
单点启动 .bin/start_fe.sh --deamon
查看运行状态(命令行模式) curl http://127.0.0.1:8030/api/bootstrap 这里的IP和端口分别是FE的IP和http_port(默认是8030) 如果返回结果中带有 "msg":"success"
字样,则说明启动成功。
查看运行状态(Web UI) 在浏览器中输入地址http:// fe_ip:8030(fe_ip指的是fe所在的节点)
1.2.2.3 连接FE
0、连接前提
下载一个MySQL客户端
1、连接FE
执行以下命令连接Doris mysql uroot -p9030 -h127.0.0.1
。
注意:
(1)这里使用的root用户是doris内置的默认用户,也是超级管理员用户。
(2)-P:这里我们连接Doris的查询端口,默认端口就是9030,对应的是fe.conf里的query_port。
(3)-h:指的是连接FE的ip地址。
(4)mysql -uroot -P9030 -h127.0.0.1
与mysql --ssl-mode=PREFERRED -uroot -P9030 -h127.0.0.1
一样,都是一开始试图建立SSL加密连接,如果失败,则尝试使用普通连接。
(5)-ssl-mode
参数是mysql5.7.11版本引入的。
2、查看FE运行状态
show frontends\G;
如果结果中IsMaster、join、Alive三列均为true,则表示节点正常。
1.2.2.4 停止FE
单点停止 `./bin/stop_fe.sh --daemon`
1.2.2.5 配置BE(Backend)
和FE配置类似
1、配置priority_networks 参数
2、配置BE数据储存目录
3、配置JAVA_HOME环境变量
由于从 1.2 版本开始支持 Java UDF 函数,BE 依赖于 Java 环境。所以要预先配置
4、安装JAVA UDF函数
安装Java UDF 函数因为从1.2 版本开始支持Java UDF 函数,需要从官网下载 Java UDF 函数的 JAR 包放到 BE 的 lib 目录下,否则可能会启动失败。
1.2.2.6 启动BE
1、在 BE 安装目录下执行下面的命令,来完成 BE 的启动。
./bin/start_be.sh --daemon
2、添加BE节点到集群
通过MySQL 客户端连接到 FE 之后执行下面的 SQL,将 BE 添加到集群中
alter System add Backend "be_host_ip:heartbeat_service_port;
1、be_host_ip:这里指的是BE的IP地址和你在 be.conf
里的 priority_networks
匹配
2、heartbeat_service_port:这里是你 BE 的心跳上报端口,和你在 be.conf
里的 heartbeat_service_port
匹配,默认是 9050
3、查看BE运行状态
可以在 MySQL 命令行下执行下面的命令查看 BE 的运行状态。
*SHOW* BACKENDS\G
4、停止BE节点
./bin/stop_be.sh
2、操作Doris
2.1 创建表
sql
CREATE TABLE IF NOT EXISTS demo.example_tbl
(
`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(`user_id`) BUCKETS 1
PROPERTIES (
#表示用默认的标签分配副本,并且副本数为1
"replication_allocation" = "tag.location.default: 1"
);
2.2 导入数据
bash
curl --location-trusted -u admin: -T /home/zhm/test.csv -H "column_separator:," http://127.0.0.1:7030/api/zhm/example_tbl/_stream_load
curl
是一个开源的命令行工具,可以用来和服务器进行数据交互,支持多种协议,如HTTP、FTP等。
--location-trusted
参数表示在HTTP重定向时自动执行跳转。如果目标URL是HTTPS协议,则不会验证证书。
-u
参数用于指定进行HTTP认证所使用的用户名和密码,格式为 username:password
。这里指定的用户名是 admin
,密码为空。
-T
参数表示使用PUT方法上传本地文件到服务器。这里指定的本地文件路径是 /home/zhm/test.csv
,即要上传的文件是 test.csv
。
-H
参数用于指定HTTP请求头信息。这里指定了一个名为 column_separator
的请求头,值为 ,
。该请求头的作用是指定上传的CSV文件中的列分隔符。
最后一个参数是需要访问的URL地址,它由三部分组成:主机名、端口号和API路径。其中,http://127.0.0.1:7030
表示主机名和端口号,/api/zhm/example_tbl/_stream_load
则表示API路径。该API用于将上传的CSV文件以流的方式加载到名为 example_tbl
的表中。
3、 端口小总结
端口号 | 作用 |
---|---|
8030 | FE的Web UI端口 |
9030 | MySQL客户端连接Doris的端口号 |
9050 | BE心跳上报端口号 |
4、 利用MySQL客户端连接Doris的原理
0、MySQL客户端连接Doris是基于MySQL协议来实现的。Doris实现了MySQL的通信协议。
1、MySQL客户端与Doris的交互过程中可概括为以下几个步骤
a、客户端发起请求连接。MySQL客户端向Doris的FE节点发起连接请求,并提供连接所需的参数(主机名、端口号、用户名和密码
b、FE节点进行身份验证并将请求转发给BE节点。FE节点首先对客户端提供的用户名和密码进行验证,如果验证通过,则将请求转发给BE节点
c、BE节点处理请求。BE节点接收到请求后,根据请求的类型(例如查询、插入、修改等),从存储引擎中获取或写入数据,并将节点返回给FE节点
这里讲的储存引擎是Palo
Palo的优点
1、列式存储
2、基于副本的高可用
3、分布式架构
4、混合储存模式
Palo的缺点
1、生态系统比较小
2、事务支持有限
事务的四大特性(ACID)
a、原子性:原子性是指事务是一个不可分割的操作单元,要么全部执行成功,要么全部回滚到初始状态。如果事务中的任何操作失败,整个事务将被回滚,所有已经进行的操作都将被撤销,使数据保持一致性。
b、一致性:致性指的是事务在执行前后,数据必须满足定义的完整性约束。事务的执行不应导致数据的矛盾或破坏数据库的完整性规则。换句话说,事务应该将数据库从一个一致状态转变为另一个一致状态。
c、隔离性:隔离性指的是并发执行的事务之间应该相互隔离,彼此无法感知对方的存在。每个事务应该像在独立执行的环境中一样,不受其他事务的干扰。这样可以避免并发执行时产生的问题,如脏读、不可重复读和幻读。
d、持久性:持久性表示一旦事务提交,其所做的改变将永久保存在数据库中,并且是可恢复的。即使系统发生故障或重启,事务提交的结果也不应该丢失。
3、存储和计算耦合
d、FE节点返回结果。FE节点接收到BE节点返回的结果后,将结果返回给客户端
注意:在连接Doris时,MySQL客户端要按照Doris所支持的MySQL版本进行设置。例如,如果Doris支持的MySQL版本是5.7,则MySQL客户端应该使用相应版本的协议来连接Doris。
5、 Doris架构
1、Frontend(FE):主要负责用户请求的接入、查询解析规划、元数据的管理、节点管理的相关工作。
2、Backend(BE):主要负责数据的存储、查询计划的执行。
这两类进程都是可以横向扩展的,单集群可以支持到数百台机器,数十PB的存储容量。并且这两类进程通过一致性协议来保证服务的高可用和数据的高可靠。这种高度集成的架构设计极大的降低了一款分布式系统的运维成本。
5.1 Doris处理任务的流程
1、用户提交一个任务到FE
2、FE将任务分成若干个Task,每个Task负责处理指定的一部分数据
3、Task被分配到指定的BE上运行。在BE上,每个Task被视为一个普通的导入任务,通过Stream Load 的导入机制进行数据处理
4、BE处理完成之后,向FE反馈处理结果
5、FE根据反馈结果,继续生存后续新的Task,或者对失败的Task进行重试。
6、整个任务处理过程通过不断的产生新的Task,来完成源源不断的数据处理。
5.2 数据模型
在Doris中,数据以表的形式进行逻辑上的描述。一张表包括行和列。Row 即用户的一行数据。Column 用于描述一行数据中不同的字段。
Column可以分为两大类:Key和Value 。从业务角度看,key和Value可以分别对应维度列 和指标列。Doris的Key列是建表语句中指定的列,建表语句中的关键字'unique key'或'aggregate key'或'duplicate key'后面的列就是 Key 列,除了Key列剩下的就是Value列。
5.2.1 Aggregate模型
sql
CREATE TABLE IF NOT EXISTS example_db.example_tbl
(
`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 "用户最小停留时间"
)
# key键
AGGREGATE KEY(`user_id`, `date`, `city`, `age`, `sex`)
#根据user_id进行分桶
DISTRIBUTED BY HASH(`user_id`) BUCKETS 1
PROPERTIES (
#数据副本为1
"replication_allocation" = "tag.location.default: 1"
);
聚合关键字 | 作用 |
---|---|
sum | 求和 |
repalce | 替换 |
max | 最大值 |
min | 最小值 |
可以看出,这个建表语句,导入数据之后,明细数据会丢失,如果想保存明细数据,需要修改表的结构,增加了一列 timestamp,记录精确到秒的数据灌入时间。 同时,将AGGREGATE KEY设置为AGGREGATE KEY(user_id, date, timestamp, city, age, sex)。
5.2.2 Unique模型
在某些多维分析场景下,为了保证 Key 的唯一性,即如何获得 Primary Key 唯一性约束。所以,有了 Unique 数据模型。
5.2.2.1 读时合并
sql
CREATE TABLE IF NOT EXISTS example_db.example_tbl
(
`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"
);
其实这个读时合并的内部实现方式和数据存储方式和聚合模型中的Replace方式是一样的。
5.2.2.2 写时合并
Unqiue模型的写时合并实现与聚合模型就是完全不同的两种模型了,查询性能更接近于duplicate模型,在有主键约束需求的场景上相比聚合模型有较大的查询性能优势,尤其是在聚合查询以及需要用索引过滤大量数据的查询中。
sql
CREATE TABLE IF NOT EXISTS example_db.example_tbl
(
`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",
"enable_unique_key_merge_on_write" = "true"
);
在开启了写时合并选项的Unique表上,数据在导入阶段就会去将覆盖和被更新的数据进行标记和删除,同时将新的数据写入到新的文件。在查询的时候,所有被标记删除的数据都会在文件级别被过滤掉,读取出来的数据就是最新的数据,消除掉了读时合并中的数据聚合过程,并且能够在很多情况下支持多种谓词下推。因此在许多场景能够带来较大的性能提升,尤其是在有聚合查询的情况下。
5.2.3 Duplicate模型
在某些多维分析场景下,数据既没有主键,也没有聚合需求。
sql
CREATE TABLE IF NOT EXISTS example_db.example_tbl
(
`timestamp` DATETIME NOT NULL COMMENT "日志时间",
`type` INT NOT NULL COMMENT "日志类型",
`error_code` INT COMMENT "错误码",
`error_msg` VARCHAR(1024) COMMENT "错误详细信息",
`op_id` BIGINT COMMENT "负责人id",
`op_time` DATETIME COMMENT "处理时间"
)
DUPLICATE KEY(`timestamp`, `type`, `error_code`)
DISTRIBUTED BY HASH(`type`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
这种数据模型区别于 Aggregate 和 Unique 模型。数据完全按照导入文件中的数据进行存储,不会有任何聚合。即使两行数据完全相同,也都会保留。 而在建表语句中指定的 DUPLICATE KEY,只是用来指明底层数据按照那些列进行排序。
5.2.4 无排序的Duplicate模型
当创建表的时候没有指定Unique、Aggregate或Duplicate时,会默认创建一个Duplicate模型的表,并自动指定排序列。
您的支持是我创作的无限动力
希望我能为您的未来尽绵薄之力
如有错误,谢谢指正;若有收获,谢谢赞美