傲渊山岳 发表于 2024-6-15 02:00:55

深入解析实时数仓Doris:介绍、架构剖析、应用场景与数据划分细节

https://img-blog.csdnimg.cn/direct/61054831eb17412e90f1e1e5417d58db.png#pic_center
    码到三十五 : 个人主页
   心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 !    Doris是一款高性能、开源的实时分析数据堆栈,旨在为用户提供毫秒级查询相应、高并发、高可用以及易于扩展的OLAP办理方案。它融合了MPP(大规模并行处置惩罚)架构与分布式存储,支持PB级别的数据存储和分析,是大数据场景下理想的实时数仓选择。


1. Doris 介绍

Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级相应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。基于此,Apache Doris 能够较好的满意报表分析、即席查询、统一数仓构建、数据湖联邦查询加速等使用场景,用户可以在此之上构建用户举动分析、AB 实行平台、日志检索分析、用户画像分析、订单分析等应用。
Apache Doris 最早是诞生于百度广告报表业务的 Palo 项目,2017 年正式对外开源,2018 年 7 月由百度捐赠给 Apache 基金会举行孵化,之后在 Apache 导师的引导下由孵化器项目管理委员会成员举行孵化和运营。目前 Apache Doris 社区已经聚集了来自差异行业数百家企业的 600 余位贡献者,并且每月活跃贡献者人数也凌驾 120 位。 2022 年 6 月,Apache Doris 成功从 Apache 孵化器毕业,正式成为 Apache 顶级项目(Top-Level Project,TLP)
Apache Doris 如今在中国乃至环球范围内都拥有着广泛的用户群体,截止目前, Apache Doris 已经在环球凌驾 4000 家企业的生产情况中得到应用,在中国市值或估值排行前 50 的互联网公司中,有凌驾 80% 长期使用 Apache Doris,包括百度、美团、小米、京东、字节跳动、腾讯、网易、快手、微博、贝壳等。同时在一些传统行业如金融、能源、制造、电信等领域也有着丰富的应用。
2. 使用场景

如下图所示,数据源经过各种数据集成和加工处置惩罚后,通常会入库到实时数仓 Doris 和离线湖仓(Hive, Iceberg, Hudi 中),Apache Doris 被广泛应用在以下场景中。Image description
https://img-blog.csdnimg.cn/direct/79ff7cf7fd93494da1d72ecfdd53aefa.png
2.1 报表分析



[*]实时看板 (Dashboards)
[*]面向企业内部分析师和管理者的报表
[*]面向用户或者客户的高并发报表分析(Customer Facing Analytics)。好比面向网站主的站点分析、面向广告主的广告报表,并发通常要求成千上万的 QPS ,查询延时要求毫秒级相应。著名的电商公司京东在广告报表中使用 Apache Doris ,每天写入 100 亿行数据,查询并发 QPS 上万,99 分位的查询延时 150ms。
2.2 即席查询(Ad-hoc Query)

面向分析师的自助分析,查询模式不固定,要求较高的吞吐。小米公司基于 Doris 构建了增长分析平台(Growing Analytics,GA),利用用户举动数据对业务举行增长分析,均匀查询延时 10s,95 分位的查询延时 30s 以内,每天的 SQL 查询量为数万条。
https://img-blog.csdnimg.cn/direct/60de81fc4dc5424bbc364b3b95717d32.jpeg#pic_center
2.3 数仓构建

一个平台满意统一的数据堆栈建设需求,简化繁琐的大数据软件栈。海底捞基于 Doris 构建的统一数仓,替换了原来由 Spark、Hive、Kudu、Hbase、Phoenix 组成的旧架构,架构大大简化。
https://img-blog.csdnimg.cn/direct/2e12643e94be45b5b80c1a53ad91708c.jpeg#pic_center
2.4 数据湖联邦查询

通过外表的方式联邦分析位于 Hive、Iceberg、Hudi 中的数据,在避免数据拷贝的条件下,查询性能大幅提升。
3. 技能概述

Doris团体架构如下图所示,Doris 架构非常简单,只有两类历程


[*] Frontend(FE),重要负责用户请求的接入、查询解析规划、元数据的管理、节点管理相关工作。
[*] Backend(BE),重要负责数据存储、查询计划的执行。
https://img-blog.csdnimg.cn/direct/898131c5f9c644b78823d4e360fa2d40.jpeg#pic_center
这两类历程都是可以横向扩展的,单集群可以支持到数百台机器,数十 PB 的存储容量。并且这两类历程通过划一性协议来包管服务的高可用和数据的高可靠。这种高度集成的架构设计极大的降低了一款分布式系统的运维成本。
https://img-blog.csdnimg.cn/direct/ce6ba62a856a4537a5cd3b34eb712eab.png
在使用接口方面,Doris 接纳 MySQL 协议,高度兼容 MySQL 语法,支持尺度 SQL,用户可以通过各类客户端工具来访问 Doris,并支持与 BI 工具的无缝对接。Doris 当前支持多种主流的 BI 产物,包括不限于 SmartBI、DataEase、FineBI、Tableau、Power BI、SuperSet 等,只要支持 MySQL 协议的 BI 工具,Doris 就可以作为数据源提供查询支持。
在存储引擎方面,Doris 接纳列式存储,按列举行数据的编码压缩和读取,能够实现极高的压缩比,同时减少大量非相关数据的扫描,从而更加有效利用 IO 和 CPU 资源。
Doris 也支持比力丰富的索引结构,来减少数据的扫描:


[*] Sorted Compound Key Index,可以最多指定三个列组成复合排序键,通过该索引,能够有效举行数据裁剪,从而能够更好支持高并发的报表场景
[*] Min/Max :有效过滤数值范例的等值和范围查询
[*] Bloom Filter :对高基数列的等值过滤裁剪非常有效
[*] Invert Index :能够对任意字段实现快速检索
在存储模型方面,Doris 支持多种存储模型,针对差异的场景做了针对性的优化:


[*] Aggregate Key 模型:雷同 Key 的 Value 列合并,通过提前聚合大幅提升性能
[*] Unique Key 模型:Key 唯一,雷同 Key 的数据覆盖,实现行级别数据更新
[*] Duplicate Key 模型:明细数据模型,满意究竟表的明细存储
Doris 也支持强划一的物化视图,物化视图的更新和选择都在系统内自动举行,不需要用户手动选择,从而大幅减少了物化视图维护的代价。
在查询引擎方面,Doris 接纳 MPP 的模型,节点间和节点内都并行执行,也支持多个大表的分布式 Shuffle Join,从而能够更好应对复杂查询。
https://img-blog.csdnimg.cn/direct/bbcab9b438cd4d8aa40d475fccc0b298.png
Doris 查询引擎是向量化的查询引擎,全部的内存结构能够按照列式布局,能够达到大幅减少虚函数调用、提升 Cache 掷中率,高效利用 SIMD 指令的结果。在宽表聚合场景下性能黑白向量化引擎的 5-10 倍。
https://img-blog.csdnimg.cn/direct/1ab8806c898f44d4aaedcb0fdf07ff14.png
Doris 接纳了 Adaptive Query Execution 技能, 可以根据 Runtime Statistics 来动态调整执行计划,好比通过 Runtime Filter 技能能够在运行时生成 Filter 推到 Probe 侧,并且能够将 Filter 自动穿透到 Probe 侧最底层的 Scan 节点,从而大幅减少 Probe 的数据量,加速 Join 性能。Doris 的 Runtime Filter 支持 In/Min/Max/Bloom Filter。
在优化器方面 Doris 使用 CBO 和 RBO 结合的优化战略,RBO 支持常量折叠、子查询改写、谓词下推等,CBO 支持 Join Reorder。目前 CBO 还在连续优化中,重要会合在更加精准的统计信息收集和推导,更加精准的代价模型预估等方面。
4. 数据划分

4.1 基本概念

在 Doris 中,数据都以表(Table)的形式举行逻辑上的形貌。
Row & Column
一张表包括行(Row)和列(Column):


[*] Row:即用户的一行数据;
[*] Column: 用于形貌一行数据中差异的字段。
Column 可以分为两大类:Key 和 Value。从业务角度看,Key 和 Value 可以分别对应维度列和指标列。Doris的key列是建表语句中指定的列,建表语句中的关键字’unique key’或’aggregate key’或’duplicate key’背面的列就是key列,除了key列剩下的就是value列。从聚合模型的角度来说,Key 列雷同的行,会聚合成一行。其中 Value 列的聚合方式由用户在建表时指定。关于更多聚合模型的介绍,可以参阅 Doris 数据模型。
Tablet & Partition
在 Doris 的存储引擎中,用户数据被程度划分为若干个数据分片(Tablet,也称作数据分桶)。每个 Tablet 包含若干数据行。各个 Tablet 之间的数据没有交集,并且在物理上是独立存储的。
多个 Tablet 在逻辑上归属于差异的分区(Partition)。一个 Tablet 只属于一个 Partition。而一个 Partition 包含若干个 Tablet。由于 Tablet 在物理上是独立存储的,所以可以视为 Partition 在物理上也是独立。Tablet 是数据移动、复制等操纵的最小物理存储单元。
若干个 Partition 组成一个 Table。Partition 可以视为是逻辑上最小的管理单元。数据的导入与删除,仅能针对一个 Partition 举行。
4.2 数据划分

我们以一个建表操纵来阐明 Doris 的数据划分。
Doris 的建表是一个同步命令,SQL执行完成即返回结果,命令返回成功即表示建表成功。详细建表语法可以参考CREATE TABLE,也可以通过 HELP CREATE TABLE; 查看更多帮助。
本末节通过一个例子,来介绍 Doris 的建表方式。
-- Range Partition

CREATE TABLE IF NOT EXISTS example_db.example_range_tbl
(
    `user_id` LARGEINT NOT NULL COMMENT "用户id",
    `date` DATE NOT NULL COMMENT "数据灌入日期时间",
    `timestamp` DATETIME 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 "用户最小停留时间"
)
ENGINE=OLAP
AGGREGATE KEY(`user_id`, `date`, `timestamp`, `city`, `age`, `sex`)
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")
)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 16
PROPERTIES
(
    "replication_num" = "3",
    "storage_medium" = "SSD",
    "storage_cooldown_time" = "2018-01-01 12:00:00"
);


-- List Partition

CREATE TABLE IF NOT EXISTS example_db.example_list_tbl
(
    `user_id` LARGEINT NOT NULL COMMENT "用户id",
    `date` DATE NOT NULL COMMENT "数据灌入日期时间",
    `timestamp` DATETIME NOT NULL COMMENT "数据灌入的时间戳",
    `city` VARCHAR(20) NOT NULL 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 "用户最小停留时间"
)
ENGINE=olap
AGGREGATE KEY(`user_id`, `date`, `timestamp`, `city`, `age`, `sex`)
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")
)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 16
PROPERTIES
(
    "replication_num" = "3",
    "storage_medium" = "SSD",
    "storage_cooldown_time" = "2018-01-01 12:00:00"
);
列定义
这里我们只以 AGGREGATE KEY 数据模型为例举行阐明。更多数据模型参阅 Doris 数据模型。
列的基本范例,可以通过在 mysql-client 中执行 HELP CREATE TABLE; 查看。
AGGREGATE KEY 数据模型中,全部没有指定聚合方式(SUM、REPLACE、MAX、MIN)的列视为 Key 列。而其余则为 Value 列。
定义列时,可参照如下发起:


[*]Key 列必须在全部 Value 列之前。
[*]尽量选择整型范例。由于整型范例的计算和查找效率远高于字符串。
[*]对于差异长度的整型范例的选择原则,遵循 够用即可。
[*]对于 VARCHAR 和 STRING 范例的长度,遵循 够用即可。
分区和分桶
Doris 支持两层的数据划分。第一层是 Partition,支持 Range 和 List 的划分方式。第二层是 Bucket(Tablet),支持 Hash 和 Random 的划分方式。
也可以仅使用一层分区,建表时如果不写分区的语句即可,此时Doris会生成一个默认的分区,对用户是透明的。使用一层分区时,只支持 Bucket 划分。下面我们来分别介绍下分区以及分桶:
Partition


[*]Partition 列可以指定一列或多列,分区列必须为 KEY 列。
[*]当 allowPartitionColumnNullable 为 true 时,Range Partition 支持使用 NULL 分区列。List Partition 始终不支持 NULL 分区列。
[*]岂论分区列是什么范例,在写分区值时,都需要加双引号。
[*]分区数目理论上没有上限。
[*]当不使用 Partition 建表时,系统会自动生成一个和表名同名的,全值范围的 Partition。该 Partition 对用户不可见,并且不可删改。
[*]创建分区时不可添加范围重叠的分区。
Range 分区


[*] 分区列通常为时间列,以方便的管理新旧数据。
[*] Range 分区支持的列范例:
[*] Partition 支持通过 VALUES LESS THAN (…) 仅指定上界,系统会将前一个分区的上界作为该分区的下界,生成一个左闭右开的区间。也支持通过 VALUES […) 指定上下界,生成一个左闭右开的区间。
[*] Version 1.2.0同时,也支持通过FROM(...) TO (...) INTERVAL ... 来批量创建分区。
通过 VALUES […) 同时指定上下界比力轻易理解。这里举例阐明,当使用 VALUES LESS THAN (…) 语句举行分区的增删操纵时,分区范围的变化情况:
如上 example_range_tbl 示例,当建表完成后,会自动生成如下3个分区:
p201701: [MIN_VALUE,2017-02-01)
p201702: [2017-02-01, 2017-03-01)
p201703: [2017-03-01, 2017-04-01)
当我们增加一个分区 p201705 VALUES LESS THAN (“2017-06-01”),分区结果如下:
p201701: [MIN_VALUE,2017-02-01)
p201702: [2017-02-01, 2017-03-01)
p201703: [2017-03-01, 2017-04-01)
p201705: 此时我们删除分区 p201703,则分区结果如下:
p201701: [MIN_VALUE,2017-02-01)
p201702: [2017-02-01, 2017-03-01)
p201705: [2017-04-01, 2017-06-01)
留意到 p201702 和 p201705 的分区范围并没有发生变化,而这两个分区之间,出现了一个空洞:[2017-03-01, 2017-04-01)。即如果导入的数据范围在这个空洞范围内,是无法导入的。
继承删除分区 p201702,分区结果如下:
p201701: [MIN_VALUE,2017-02-01)
p201705: [2017-04-01, 2017-06-01)
空洞范围变为:[2017-02-01, 2017-04-01)
现在增加一个分区 p201702new VALUES LESS THAN (“2017-03-01”),分区结果如下:
p201701:    [MIN_VALUE,2017-02-01)
p201702new: [2017-02-01, 2017-03-01)
p201705:    [2017-04-01, 2017-06-01)
可以看到空洞范围缩小为:[2017-03-01, 2017-04-01)
现在删除分区 p201701,并添加分区 p201612 VALUES LESS THAN (“2017-01-01”),分区结果如下:
p201612:    [MIN_VALUE,2017-01-01)
p201702new: [2017-02-01, 2017-03-01)
p201705:    [2017-04-01, 2017-06-01)
即出现了一个新的空洞:[2017-01-01, 2017-02-01)
综上,分区的删除不会改变已存在分区的范围。删除分区可能出现空洞。通过 VALUES LESS THAN 语句增加分区时,分区的下界紧接上一个分区的上界。
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")
)
在以上示例中,我们指定 date(DATE 范例) 和 id(INT 范例) 作为分区列。以上示例最终得到的分区如下:
* p201701_1000:    [(MIN_VALUE,MIN_VALUE), ("2017-02-01", "1000")   )
* p201702_2000:    [("2017-02-01", "1000"),("2017-03-01", "2000")   )
* p201703_all:   [("2017-03-01", "2000"),("2017-04-01", MIN_VALUE))
留意,末了一个分区用户缺省只指定了 date 列的分区值,所以 id 列的分区值会默认填充 MIN_VALUE。当用户插入数据时,分区列值会按照顺序依次比力,最终得到对应的分区。举比方下:
* 数据-->分区
* 2017-01-01, 200   --> p201701_1000
* 2017-01-01, 2000    --> p201701_1000
* 2017-02-01, 100   --> p201701_1000
* 2017-02-01, 2000    --> p201702_2000
* 2017-02-15, 5000    --> p201702_2000
* 2017-03-01, 2000    --> p201703_all
* 2017-03-10, 1       --> p201703_all
* 2017-04-01, 1000    --> 无法导入
* 2017-05-01, 1000    --> 无法导入
Range分区同样支持批量分区, 通过语句 FROM (“2022-01-03”) TO (“2022-01-06”) INTERVAL 1 DAY 批量创建按天划分的分区:2022-01-03到2022-01-06(不含2022-01-06日),分区结果如下:
   p20220103: [2022-01-03, 2022-01-04) p20220104: [2022-01-04,
2022-01-05) p20220105: [2022-01-05, 2022-01-06)
List 分区
分区列支持 BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, DATE, DATETIME, CHAR, VARCHAR 数据范例,分区值为枚举值。只有当数据为目的分区枚举值其中之一时,才可以掷中分区。
Partition 支持通过 VALUES IN (…) 来指定每个分区包含的枚举值。
下面通过示例阐明,举行分区的增删操纵时,分区的变化。
如上 example_list_tbl 示例,当建表完成后,会自动生成如下3个分区:
   p_cn: (“Beijing”, “Shanghai”, “Hong Kong”) p_usa: (“New York”, “San
Francisco”) p_jp: (“Tokyo”)
当我们增加一个分区 p_uk VALUES IN (“London”),分区结果如下:
   p_cn: (“Beijing”, “Shanghai”, “Hong Kong”) p_usa: (“New York”, “San
Francisco”) p_jp: (“Tokyo”) p_uk: (“London”)
当我们删除分区 p_jp,分区结果如下:
   p_cn: (“Beijing”, “Shanghai”, “Hong Kong”) p_usa: (“New York”, “San
Francisco”) p_uk: (“London”)
List分区也支持多列分区,示比方下:
   PARTITION BY LIST(id, city) (
PARTITION p1_city VALUES IN ((“1”, “Beijing”), (“1”, “Shanghai”)),
PARTITION p2_city VALUES IN ((“2”, “Beijing”), (“2”, “Shanghai”)),
PARTITION p3_city VALUES IN ((“3”, “Beijing”), (“3”, “Shanghai”)) )
在以上示例中,我们指定 id(INT 范例) 和 city(VARCHAR 范例) 作为分区列。以上示例最终得到的分区如下:


[*]p1_city: [(“1”, “Beijing”), (“1”, “Shanghai”)]
[*]p2_city: [(“2”, “Beijing”), (“2”, “Shanghai”)]
[*]p3_city: [(“3”, “Beijing”), (“3”, “Shanghai”)]
当用户插入数据时,分区列值会按照顺序依次比力,最终得到对应的分区。举比方下:


[*]数据 —> 分区
[*]1, Beijing —> p1_city
[*]1, Shanghai —> p1_city
[*]2, Shanghai —> p2_city
[*]3, Beijing —> p3_city
[*]1, Tianjin —> 无法导入
[*]4, Beijing —> 无法导入
Bucket


[*] 如果使用了 Partition,则 DISTRIBUTED … 语句形貌的是数据在各个分区内的划分规则。如果不使用 Partition,则形貌的是对整个表的数据的划分规则。
[*] 分桶列可以是多列,Aggregate 和 Unique 模型必须为 Key 列,Duplicate 模型可以是 key 列和 value 列。分桶列可以和 Partition 列雷同或差异。
[*] 分桶列的选择,是在 查询吞吐 和 查询并发 之间的一种衡量:

[*]如果选择多个分桶列,则数据分布更均匀。如果一个查询条件不包含全部分桶列的等值条件,那么该查询会触发全部分桶同时扫描,这样查询的吞吐会增加,单个查询的延伸随之降低。这个方式适合大吞吐低并发的查询场景。
[*]如果仅选择一个或少数分桶列,则对应的点查询可以仅触发一个分桶扫描。此时,当多个点查询并发时,这些查询有较大的概率分别触发差异的分桶扫描,各个查询之间的IO影响较小(尤其当差异桶分布在差异磁盘上时),所以这种方式适合高并发的点查询场景。

[*] AutoBucket: 根据数据量,计算分桶数。 对于分区表,可以根据历史分区的数据量、机器数、盘数,确定一个分桶。
[*] 分桶的数目理论上没有上限。
关于 Partition 和 Bucket 的数目和数据量的发起


[*]一个表的 Tablet 总数目等于 (Partition num * Bucket num)。
[*]一个表的 Tablet 数目,在不思量扩容的情况下,推荐略多于整个集群的磁盘数目。
单个 Tablet 的数据量理论上没有上下界,但发起在 1G - 10G 的范围内。如果单个 Tablet 数据量过小,则数据的聚合结果不佳,且元数据管理压力大。如果数据量过大,则倒霉于副本的迁移、补齐,且会增加 Schema Change 或者 Rollup 操纵失败重试的代价(这些操纵失败重试的粒度是 Tablet)。
[*]当 Tablet 的数据量原则和数目原则辩论时,发起优先思量数据量原则。
[*]在建表时,每个分区的 Bucket 数目统一指定。但是在动态增加分区时(ADD PARTITION),可以单独指定新分区的 Bucket 数目。可以利用这个功能方便的应对数据缩小或膨胀。
[*]一个 Partition 的 Bucket 数目一旦指定,不可更改。所以在确定 Bucket 数目时,需要预先思量集群扩容的情况。好比当前只有 3 台 host,每台 host 有 1 块盘。如果 Bucket 的数目只设置为 3 或更小,那么后期纵然再增加机器,也不能提高并发度。
[*]举一些例子:假设在有10台BE,每台BE一块磁盘的情况下。如果一个表总巨细为 500MB,则可以思量4-8个分片。5GB:8-16个分片。50GB:32个分片。500GB:发起分区,每个分区巨细在 50GB 左右,每个分区16-32个分片。5TB:发起分区,每个分区巨细在 50GB 左右,每个分区16-32个分片。
注:表的数据量可以通过 SHOW DATA 命令查看,结果除以副本数,即表的数据量。
关于 Random Distribution 的设置以及使用场景


[*]如果 OLAP 表没有更新范例的字段,将表的数据分桶模式设置为 RANDOM,则可以避免严重的数据倾斜(数据在导入表对应的分区的时间,单次导入作业每个 batch 的数据将随机选择一个tablet举行写入)。
[*]当表的分桶模式被设置为RANDOM 时,由于没有分桶列,无法根据分桶列的值仅对几个分桶查询,对表举行查询的时间将对掷中分区的全部分桶同时扫描,该设置适合对表数据团体的聚合查询分析而不适合高并发的点查询。
[*]如果 OLAP 表的是 Random Distribution 的数据分布,那么在数据导入的时间可以设置单分片导入模式(将 load_to_single_tablet 设置为 true),那么在大数据量的导入的时间,一个任务在将数据写入对应的分区时将只写入一个分片,这样将能提高数据导入的并发度和吞吐量,减少数据导入和 Compaction 导致的写放大题目,保障集群的稳固性。
复合分区与单分区
复合分区


[*]第一级称为 Partition,即分区。用户可以指定某一维度列作为分区列(当前只支持整型和时间范例的列),并指定每个分区的取值范围。
[*]第二级称为 Distribution,即分桶。用户可以指定一个或多个维度列以及桶数对数据举行 HASH 分布 或者不指定分桶列设置成 Random Distribution 对数据举行随机分布。
以下场景推荐使用复合分区


[*]有时间维度或类似带有有序值的维度,可以以这类维度列作为分区列。分区粒度可以根据导入频次、分区数据量等举行评估。
[*]历史数据删除需求:如有删除历史数据的需求(好比仅保留最近N 天的数据)。使用复合分区,可以通过删除历史分区来达到目的。也可以通过在指定分区内发送 DELETE 语句举行数据删除。
[*]办理数据倾斜题目:每个分区可以单独指定分桶数目。如按天分区,当每天的数据量差异很大时,可以通过指定分区的分桶数,合理划分差异分区的数据,分桶列发起选择区分度大的列。
[*]用户也可以不使用复合分区,纵然用单分区。则数据只做 HASH 分布。
ENGINE
本示例中,ENGINE 的范例是 olap,即默认的 ENGINE 范例。在 Doris 中,只有这个 ENGINE 范例是由 Doris 负责数据管理和存储的。其他 ENGINE 范例,如 mysql、broker、es 等等,本质上只是对外部其他数据库或系统中的表的映射,以包管 Doris 可以读取这些数据。而 Doris 自己并不创建、管理和存储任何非 olap ENGINE 范例的表和数据。
其他
IF NOT EXISTS 表示如果没有创建过该表,则创建。留意这里只判定表名是否存在,而不会判定新建表结构是否与已存在的表结构雷同。所以如果存在一个同名但差异构的表,该命令也会返回成功,但并不代表已经创建了新的表和新的结构。
   术因分享而日新,每获新知,喜溢心扉。
诚邀关注公众号 『 码到三十五 』 ,获取更多技能资料。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 深入解析实时数仓Doris:介绍、架构剖析、应用场景与数据划分细节