51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Apache Doris 语法

1、Doris 简介

OLAP和OLTP

  • 联机事务处理OLTP(On-Line Transaction Processing)

    • 公司业务系统使用数据库的场景,针对业务系统数据库有大量随机的增删改查

    • 高并发

    • 速度要快

    • 支持事务

  • 联机分析处理OLAP(On-Line Analytical Processing)

    • 公司的数据分析使用数据库的场景,对已经生成好的数据进行统计分析

    • 一次操作都是针对的整个数据集

    • 只有查这个动作,不会去增删改

    • 查询的响应速度相对慢点也能接受

    • 并发量要求不是太高

2、安装

>>略过 后期添加

使用 MySQL Client 连接 FE

mysql -h doitedu01 -P 9030 -uroot

这个只是用了mysql的客户端去连接doris的fe,不是启动的mysql哦!!!并且第一次进去的话,是不需要密码的
解释:
-h  连接地址
-P  端口号
-u  账号
-p  密码

--这个可以设置可以不设置啦,正常生产过程中都会设置一个相对比较复杂的密码,学习的时候就无所谓了
--如果想设置,下面的命令就可以
SET PASSWORD FOR 'root' = PASSWORD('123456');

fe启动完成后可以查看fe的运行状态

fe启动完成后可以查看fe的运行状态
SHOW PROC '/frontends'\G;

添加Fe节点 FE 分为 Leader,Follower 和 Observer 三种角色
ALTER SYSTEM ADD FOLLOWER "doitedu02:9010"; 
ALTER SYSTEM ADD OBSERVER "doitedu03:9010";
删除
ALTER SYSTEM DROP FOLLOWER "doitedu02:9010"; 
ALTER SYSTEM DROP OBSERVER "doitedu03:9010"

在doitedu02和doitedu03上分别启动FE节点
/opt/app/doris/fe/bin/start_fe.sh --helper  doitedu01:9010 --daemon
记住哦,如果是第一次添加的话,一定要加这两个参数  --helper  doitedu01:9010  
第一次没添加的 找到你配置的文件地址 把里面的文件删掉

添加 BE 节点
ALTER SYSTEM ADD BACKEND "doitedu01:9050"; 
查看 BE 状态
SHOW PROC '/backends';
Alive 为 false 表示该 BE 节点还是死的
-- 删除be 节点
ALTER SYSTEM DECOMMISSION BACKEND "doitedu01:9050"; 

添加broker
# 创建 broker
alter system add broker broker_name "192.168.31.128:8000"
#查看 Broker 状态 
show  proc "/brokers";
# 删除 broker
alter system DROP ALL  BROKER  broker_name ;

3、数据表

1、字段类型

>> 略过 后期添加

2、表的基本概念

1、Row & Column

一张表包括行(Row)和列(Column);
Row 即用户的一行数据。Column 用于描述一行数据中不同的字段。

>doris中的列分为两类:key列和value列key列在doris中有两种作用:聚合表模型中,key是聚合和排序的依据其他表模型中,key是排序依据 doris的所有数据都是按照key的字段顺序进行一个排序的(可以理解成索引)

2、分区与分桶

partition(分区):是在逻辑上将一张表按行(横向)划分 (等于说把数据按某个字段进行分割,但是并不是分开存储)
tablet(又叫bucket,分桶):在物理上对一个分区再按行(横向)划分(把分区的数据 经过一个hashcode值%桶数算出桶号,之后创建个文件夹进行存储,文件名就是桶号)

2.1、Partition分区

  • Partition 列可以指定一列或多列,在聚合模型中,分区列必须为 KEY 列。

  • 不论分区列是什么类型,在写分区值时,都需要加双引号。

  • 分区数量理论上没有上限。

  • 当不使用 Partition 建表时,系统会自动生成一个和表名同名的,全值范围的 Partition。该 Partition 对用户不可见,并且不可删改。

  • 创建分区时不可添加范围重叠的分区。

2.1.1、Range 分区

  • 如果没有分区 ,数据插入不进去 :比如 插入一条2017-06-08的数据 现在的分区范围只有五个并没有满足这个数据的分区, 所以不会插入成功

  • 如果删除分区会出现空洞范围,不会影响到其他的分区,但是这个分区范围内的数据会插入不进去

  • 如果添加分区,比如2017-2-25,他会以上一个分区的下限为上限创建一个分区 如 2017-02-01~~~2017-02-25

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

** Range分区除了上述我们看到的单列分区,也支持多列分区,示例如下**

PARTITION BY RANGE(`date`, `id`)     前闭后开
(
    PARTITION `p201701_1000` VALUES LESS THAN ("2017-02-01", "1000"),
    PARTITION `p201702_2000` VALUES LESS THAN ("2017-03-01", "2000"),
    PARTITION `p201703_all`  VALUES LESS THAN ("2017-04-01")-- 默认采用id类型的最小值
)

2.1.2、List 分区

分区列支持 BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, DATE, DATETIME, CHAR, VARCHAR 数据类型,分区值为枚举值。只有当数据为目标分区枚举值其中之一时,才可以命中分区。 Partition 支持通过 VALUES IN (...) 来指定每个分区包含的枚举值。

PARTITION BY LIST(`id`, `city`)
(
    PARTITION `p1_city` VALUES IN (("1", "Beijing",), ("2", "Shanghai")),
    PARTITION `p2_city` VALUES IN (("2", "Beijing"), ("1", "Shanghai")),
    PARTITION `p3_city` VALUES IN (("3", "Beijing"), ("4", "Shanghai"))

)
* 数据  --->  分区
* 1, Beijing     ---> p1_city
* 1, Shanghai    ---> p1_city
* 2, Shanghai    ---> p2_city
* 3, Beijing     ---> p3_city
* 1, Tianjin     ---> 无法导入
* 4, Beijing     ---> 无法导入

2.2、Bucket 分桶

  • 如果使用了 Partition(分区),则 DISTRIBUTED ... 语句描述的是数据在各个分区内的划分规则。如果不使用 Partition(分区),则描述的是对整个表的数据的进行一个分桶。

  • 分桶列可以是多列,但必须为Key 列。分桶列可以和 Partition 列相同或不同。

  • 分桶列的选择,是在查询吞吐查询并发 之间的一种权衡:

    • 如果选择多个分桶列(多个key 进行hashcode ),则数据分布更均匀。如果一个查询条件不包含所有分桶列的等值条件,那么该查询会触发所有分桶同时扫描,这样查询的吞吐会增加,单个查询的延迟随之降低。这个方式适合大吞吐低并发的查询场景。(桶分的多了,如果触发所有分桶的扫描,磁盘IO的读写压力会增加,如果这时候多个用户一起触发效率会慢

    • 如果仅选择一个或少数分桶列,则对应的点查询可以仅触发一个分桶扫描。此时,当多个点查询并发时,这些查询有较大的概率分别触发不同的分桶扫描,各个查询之间的IO影响较小(尤其当不同桶分布在不同磁盘上时),所以这种方式适合高并发的点查询场景。(每个桶里数据较多,单次查询效率不如多列桶的效率

  • 分桶的数量理论上没有上限

    DISTRIBUTED BY HASH(user_id) BUCKETS 1

2.3、关于 Partition 和 Bucket的数量和数据量的建议。

  • 一个表的 Tablet 总数量 等于 (Partition 参数数量 * Bucket 参数数量)。

  • 一个表的 Tablet 数量,在不考虑扩容的情况下,推荐略多于整个集群的磁盘数量。

  • 单个tablet(桶)的数据量建议在 1G - 10G 的范围内 ,如果单个tablet数据量过小,那么聚合效果不佳(慢),并且元数据管理压力大(麻烦),如果数据量过大,那么副本的迁移、补齐,且会增加 Schema Change 或者 Rollup 操作失败重试的代价(这些操作失败重试的粒度是 Tablet)。分桶应该控制桶内数据量 ,不易过大或者过小

  • 当 Tablet 的数据量原则和数量原则冲突时,建议优先考虑数据量原则。

  • 在建表时,每个分区的 Bucket 数量统一指定。但是在动态增加分区时(ADD PARTITION),可以单独指定新分区的 Bucket 数量。可以利用这个功能方便的应对数据缩小或膨胀。

    -** 案例:假如按日期进行分区,每个分区的桶为10,每个桶的数据量为1个G,但是11号这天数据量大有1T,那么我可以给11号单独创建个分区,这个分区的桶数为50,那么这个分区桶的数据量就只有2G**

  • 一个 Partition 的 Bucket 数量一旦指定,不可更改。所以在确定 Bucket 数量时,需要预先考虑集群扩容的情况。比如当前只有 3 台 host,每台 host 有 1 块盘。如果 Bucket 的数量只设置为 3 或更小,那么后期即使再增加机器,也不能提高并发度。

2.4、进阶:复合分区与单分区的选择

  1. 单分区:就是在创建表的时候不指定分区,只指定了分桶,那么这时候doris会把整个表当个大的分区

  2. 复合分区:是创建表的时候既指定分区参数,又指定分桶参数

    1. 第一级称为 Partition,即分区。用户可以指定某一维度列作为分区列(当前只支持整型时间类型的列),并指定每个分区的取值范围。

    2. 第二级称为 Distribution,即分桶。用户可以指定一个或多个维度列以及桶数对数据进行 HASH 分布。

>以下场景推荐使用复合分区

赞(8)
未经允许不得转载:工具盒子 » Apache Doris 语法