聊聊分布式 SQL 数据库Doris(三)
在 Doris 的存儲引擎規(guī)則:
- 表的數(shù)據(jù)是以分區(qū)為單位存儲的,不指定分區(qū)創(chuàng)建時,默認就一個分區(qū).
- 用戶數(shù)據(jù)首先被劃分成若干個分區(qū)(Partition),劃分的規(guī)則通常是按照用戶指定的分區(qū)列進行范圍劃分,比如按時間劃分。
- 在每個分區(qū)內(nèi),數(shù)據(jù)被進一步的按照Hash的方式分桶,分桶的規(guī)則是要找用戶指定的分桶列的值進行Hash后分桶。每個分桶就是一個數(shù)據(jù)分片(Tablet),也是數(shù)據(jù)劃分的最小邏輯單元。
- Partition 可以視為是邏輯上最小的管理單元。數(shù)據(jù)的導入與刪除,都可以或僅能針對一個 Partition 進行。
- Tablet直接的數(shù)據(jù)是沒有交集的,獨立存儲的。Tablet也是數(shù)據(jù)移動、復制等操作的最小物理存儲單元。
Table (邏輯描述) -- > Partition(分區(qū):管理單元) --> Bucket(分桶:存儲,每個分桶就是一個數(shù)據(jù)分片:Tablet,數(shù)據(jù)劃分的最小邏輯單元。稱為子表) ,如下圖:
語法與示例
語法:
-- 該表記錄了某個時間點,在某個站點上各個用戶的pv數(shù)據(jù)
CREATE TABLE demo.test_tbl(
sdate DATE, -- 日期
site INT, -- 站點id
city VARCHAR(64), -- 城市
user VARCHAR(32) DEFAULT '', -- 用戶名
pv BIGINT -- pv量
) ENGINE=olap DUPLICATE KEY(sdate, site, city)
[PARTITION_DESC]
[BUCKET_DESC]
PROPERTIES ("replication_num" = "1");
[PARTITION_DESC] 表示創(chuàng)建分區(qū)的詳細語句,[BUCKET_DESC] 表示創(chuàng)建分桶的語句.
動態(tài)分區(qū):
PARTITION BY RANGE(sdate)()
-- 剩余參數(shù)需要在PARTITION進行配置:
PROPERTIES (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-30",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.create_history_partition"="true",
"replication_num" = "1"
);
分桶:
DISTRIBUTED BY HASH(site) BUCKETS 20
此時指定以 site 列的哈希值作為分桶,并且分桶個數(shù)設置為 20 個.
官方示例:
CREATE TABLE tbl1
(
k1 DATE,
-- ...
)
PARTITION BY RANGE(k1) ()
DISTRIBUTED BY HASH(k1)
PROPERTIES
(
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-7",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "32"
);
批量分區(qū)與自動分桶
批量分區(qū)使得用戶能夠批量操作表的分區(qū)結構,一次性創(chuàng)建多個分區(qū),而不是逐個單獨創(chuàng)建。
-- 當然,分區(qū)創(chuàng)建個數(shù)受到max_multi_partition_num參數(shù)控制,該值默認為4096,有需求可以修改
PARTITION BY RANGE(sdate)
(
FROM ("2013-01-01") TO ("2023-01-01") INTERVAL 1 DAY
)
-- 從這個 case 來看,批量分區(qū)功能的語法更為簡潔,但該功能的易用性和靈活性遠不止于此。
自動分桶是基于表中某個列(或在創(chuàng)建表時指定咧)的值范圍進行的。系統(tǒng)會根據(jù)該列的數(shù)據(jù)分布情況,將數(shù)據(jù)劃分到不同的數(shù)據(jù)桶中。
-- 舊版本指定分桶個數(shù)的創(chuàng)建語法
DISTRIBUTED BY HASH(site) BUCKETS 20
-- 新版本使用自動分桶推算的創(chuàng)建語法
DISTRIBUTED BY HASH(site) BUCKETS AUTO
properties("estimate_partition_size" = "100G")
底層邏輯
查詢路由
一個分區(qū)的數(shù)據(jù)不會跨多個不同的BE節(jié)點存儲.
在 Apache Doris 中,當請求到來時,查詢某個分區(qū)的數(shù)據(jù)時,Doris 使用以下的過程來定位到相應的 Backend(BE)節(jié)點:
-
分區(qū)鍵(Partition Key): 在 Doris 中,表的分區(qū)是按照某一列的值范圍進行劃分的,這個列通常被稱為分區(qū)鍵。用戶在創(chuàng)建表時可以選擇分區(qū)鍵。
-
查詢請求中的分區(qū)鍵值: 當查詢請求到達 Doris 時,請求中通常包含了要查詢的分區(qū)鍵值。
-
分區(qū)鍵值與分區(qū)映射關系: Doris 通過分區(qū)鍵值與分區(qū)的映射關系,確定具體的分區(qū)。這個映射關系通常存儲在系統(tǒng)的元數(shù)據(jù)中,其中包括每個分區(qū)所在的 BE 節(jié)點信息。
-
BE 節(jié)點負責的分區(qū): 根據(jù)分區(qū)鍵值的映射關系,Doris 確定了負責該分區(qū)的 BE 節(jié)點。
-
查詢計劃的生成和執(zhí)行: Doris 生成查詢計劃,其中包含了具體的查詢操作。該計劃會被發(fā)送到負責該分區(qū)的 BE 節(jié)點上執(zhí)行。
在 Apache Doris 中,一個表的多個分區(qū)數(shù)據(jù)通常會存儲在不同的 Backend(BE)節(jié)點上,以實現(xiàn)分布式存儲和查詢的優(yōu)勢。每個分區(qū)的數(shù)據(jù)都會被劃分并存儲在負責該分區(qū)的一個 BE 節(jié)點上。具體來說:
-
表的分區(qū): Doris 中的表通常根據(jù)某一列的值范圍進行分區(qū)。每個分區(qū)是表的邏輯組織單元,用于提高查詢性能、管理數(shù)據(jù)、支持按范圍刪除等操作。
-
分布式存儲: Doris 的設計目標之一是分布式存儲和查詢。因此,一個表的多個分區(qū)數(shù)據(jù)會被分布存儲在不同的 BE 節(jié)點上。這樣的設計有助于提高系統(tǒng)的橫向擴展性,允許系統(tǒng)有效地處理大規(guī)模數(shù)據(jù)和高并發(fā)的查詢請求。
-
負責分區(qū)的 BE 節(jié)點: Doris 通過元數(shù)據(jù)信息記錄每個分區(qū)所在的 BE 節(jié)點。當執(zhí)行查詢請求時,Doris 會根據(jù)查詢涉及的分區(qū),確定負責這些分區(qū)的 BE 節(jié)點。每個 BE 節(jié)點負責存儲和管理分配給它的分區(qū)數(shù)據(jù)。
-
分布式計算: 查詢請求在涉及多個分區(qū)時,Doris 可以通過分布式計算的方式,在多個 BE 節(jié)點上并行執(zhí)行查詢計劃,以提高查詢性能。
分桶算法
暫時只支持HASH.
分區(qū)算法
暫時只支持List, RANGE. 常用的有四種: (a) Round-Robin、(b) Range、(c) List、(d) Hash .
詳細內(nèi)容閱讀: Apache Doris 分區(qū)分桶新功能 與 數(shù)據(jù)劃分. 在此基礎上做總結與延伸.
參考:
Doris數(shù)據(jù)分布
總結
以上是生活随笔為你收集整理的聊聊分布式 SQL 数据库Doris(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星Galaxy Z Fold 2折叠屏
- 下一篇: [Flink] Flink(CDC/SQ