首先,您需要对象存储桶和相关的访问密钥(AK) 和秘密访问密钥(SK)。
然后,您可以按照以下六个步骤开始冷/热数据分离。
1.创建资源
您可以使用AK和SK的对象存储桶创建资源。 Apache Doris支持在包括AWS,Azure和Alibaba Cloud在内的各种云服务提供商上存储对象存储。
CREATE RESOURCE IF NOT EXISTS "${resource_name}"
PROPERTIES(
"type"="s3",
"s3.endpoint" = "${S3Endpoint}",
"s3.region" = "${S3Region}",
"s3.root.path" = "path/to/root",
"s3.access_key" = "${S3AK}",
"s3.secret_key" = "${S3SK}",
"s3.connection.maximum" = "50",
"s3.connection.request.timeout" = "3000",
"s3.connection.timeout" = "1000",
"s3.bucket" = "${S3BucketName}"
);
2.创建存储策略
使用存储策略,您可以指定数据的冷却期(包括绝对冷却期和相对冷却时期)。
CREATE STORAGE POLICY testPolicy
PROPERTIES(
"storage_resource" = "remote_s3",
"cooldown_ttl" = "1d"
);
在上述片段中,存储策略命名为testPolicy
,并且在摄入后的一天将开始冷却数据。冷数据将在对象存储remote_s3
的root path
下移动。除了设置TTL外,您还可以在冷却开始时指定时间点。
CREATE STORAGE POLICY testPolicyForTTlDatatime
PROPERTIES(
"storage_resource" = "remote_s3",
"cooldown_datetime" = "2023-06-07 21:00:00"
);
3.指定表/分区的存储策略
使用已建立的资源和存储策略,您可以为数据表或特定数据分区设置存储策略。
以下片段以TPC-H数据集中的LineItem表为例。要为整表设置存储策略,请按以下方式指定属性:
CREATE TABLE IF NOT EXISTS lineitem1 (
L_ORDERKEY INTEGER NOT NULL,
L_PARTKEY INTEGER NOT NULL,
L_SUPPKEY INTEGER NOT NULL,
L_LINENUMBER INTEGER NOT NULL,
L_QUANTITY DECIMAL(15,2) NOT NULL,
L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL,
L_DISCOUNT DECIMAL(15,2) NOT NULL,
L_TAX DECIMAL(15,2) NOT NULL,
L_RETURNFLAG CHAR(1) NOT NULL,
L_LINESTATUS CHAR(1) NOT NULL,
L_SHIPDATE DATEV2 NOT NULL,
L_COMMITDATE DATEV2 NOT NULL,
L_RECEIPTDATE DATEV2 NOT NULL,
L_SHIPINSTRUCT CHAR(25) NOT NULL,
L_SHIPMODE CHAR(10) NOT NULL,
L_COMMENT VARCHAR(44) NOT NULL
)
DUPLICATE KEY(L_ORDERKEY, L_PARTKEY, L_SUPPKEY, L_LINENUMBER)
PARTITION BY RANGE(`L_SHIPDATE`)
(
PARTITION `p202301` VALUES LESS THAN ("2017-02-01"),
PARTITION `p202302` VALUES LESS THAN ("2017-03-01")
)
DISTRIBUTED BY HASH(L_ORDERKEY) BUCKETS 3
PROPERTIES (
"replication_num" = "3",
"storage_policy" = "${policy_name}"
)
您可以通过show tablets
命令检查平板电脑的存储策略。如果CooldownReplicaId
是什么而不是-1
,而CooldownMetaId
不是零,则意味着当前平板电脑已用存储策略指定。
TabletId: 3674797
ReplicaId: 3674799
BackendId: 10162
SchemaHash: 513232100
Version: 1
LstSuccessVersion: 1
LstFailedVersion: -1
LstFailedTime: NULL
LocalDataSize: 0
RemoteDataSize: 0
RowCount: 0
State: NORMAL
LstConsistencyCheckTime: NULL
CheckVersion: -1
VersionCount: 1
QueryHits: 0
PathHash: 8030511811695924097
MetaUrl: http://172.16.0.16:6781/api/meta/header/3674797
CompactionStatus: http://172.16.0.16:6781/api/compaction/show?tablet_id=3674797
CooldownReplicaId: 3674799
CooldownMetaId: TUniqueId(hi:-8987737979209762207, lo:-2847426088899160152)
要为特定分区设置存储策略,请在分区属性中添加策略名称:
CREATE TABLE IF NOT EXISTS lineitem1 (
L_ORDERKEY INTEGER NOT NULL,
L_PARTKEY INTEGER NOT NULL,
L_SUPPKEY INTEGER NOT NULL,
L_LINENUMBER INTEGER NOT NULL,
L_QUANTITY DECIMAL(15,2) NOT NULL,
L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL,
L_DISCOUNT DECIMAL(15,2) NOT NULL,
L_TAX DECIMAL(15,2) NOT NULL,
L_RETURNFLAG CHAR(1) NOT NULL,
L_LINESTATUS CHAR(1) NOT NULL,
L_SHIPDATE DATEV2 NOT NULL,
L_COMMITDATE DATEV2 NOT NULL,
L_RECEIPTDATE DATEV2 NOT NULL,
L_SHIPINSTRUCT CHAR(25) NOT NULL,
L_SHIPMODE CHAR(10) NOT NULL,
L_COMMENT VARCHAR(44) NOT NULL
)
DUPLICATE KEY(L_ORDERKEY, L_PARTKEY, L_SUPPKEY, L_LINENUMBER)
PARTITION BY RANGE(`L_SHIPDATE`)
(
PARTITION `p202301` VALUES LESS THAN ("2017-02-01") ("storage_policy" = "${policy_name}"),
PARTITION `p202302` VALUES LESS THAN ("2017-03-01")
)
DISTRIBUTED BY HASH(L_ORDERKEY) BUCKETS 3
PROPERTIES (
"replication_num" = "3"
)
这是您可以确认仅设定目标分区的存储策略的方式:
在上面的示例中,Table LineItem1具有2个分区,每个分区都有3个存储桶,而replication_num
设置为“ 3”。这意味着有2*3 = 6片和6*3 = 18 = 18副本。
现在,如果您通过show tablets
命令检查所有平板电脑的复制品信息,您会发现只有目标部分平板电脑的复制品具有冷却式雷神化和冷却型。 (要明确比较,您可以通过ADMIN SHOW REPLICA STATUS FROM TABLE PARTITION(PARTITION)
命令查看特定分区的复制信息。)
例如,平板电脑3691990属于PARTITION P202301,这是目标分区,因此该平板电脑的3个复制品具有冷却式雷神和冷却型:
:
*****************************************************************
TabletId: 3691990
ReplicaId: 3691991
CooldownReplicaId: 3691993
CooldownMetaId: TUniqueId(hi:-7401335798601697108, lo:3253711199097733258)
*****************************************************************
TabletId: 3691990
ReplicaId: 3691992
CooldownReplicaId: 3691993
CooldownMetaId: TUniqueId(hi:-7401335798601697108, lo:3253711199097733258)
*****************************************************************
TabletId: 3691990
ReplicaId: 3691993
CooldownReplicaId: 3691993
CooldownMetaId: TUniqueId(hi:-7401335798601697108, lo:3253711199097733258)
另外,以上片段意味着所有这3个复制品都已用相同的冷却式雷神:3691993指定,因此仅复制品中的数据3691993中的数据将存储在资源中。
。4.查看平板电脑详细信息
您可以通过show tablets from lineitem1
命令查看Table LineItem1的详细信息。在所有属性中,LocalDataSize
代表局部存储的数据的大小,而RemoteDataSize
表示对象存储中冷数据的大小。
例如,当将数据新摄入到多丽丝后端时,您会看到所有数据都在本地存储。
*************************** 1. row ***************************
TabletId: 2749703
ReplicaId: 2749704
BackendId: 10090
SchemaHash: 1159194262
Version: 3
LstSuccessVersion: 3
LstFailedVersion: -1
LstFailedTime: NULL
LocalDataSize: 73001235
RemoteDataSize: 0
RowCount: 1996567
State: NORMAL
LstConsistencyCheckTime: NULL
CheckVersion: -1
VersionCount: 3
QueryHits: 0
PathHash: -8567514893400420464
MetaUrl: http://172.16.0.8:6781/api/meta/header/2749703
CompactionStatus: http://172.16.0.8:6781/api/compaction/show?tablet_id=2749703
CooldownReplicaId: 2749704
CooldownMetaId:
数据冷却后,您会看到数据已移至远程对象存储。
*************************** 1. row ***************************
TabletId: 2749703
ReplicaId: 2749704
BackendId: 10090
SchemaHash: 1159194262
Version: 3
LstSuccessVersion: 3
LstFailedVersion: -1
LstFailedTime: NULL
LocalDataSize: 0
RemoteDataSize: 73001235
RowCount: 1996567
State: NORMAL
LstConsistencyCheckTime: NULL
CheckVersion: -1
VersionCount: 3
QueryHits: 0
PathHash: -8567514893400420464
MetaUrl: http://172.16.0.8:6781/api/meta/header/2749703
CompactionStatus: http://172.16.0.8:6781/api/compaction/show?tablet_id=2749703
CooldownReplicaId: 2749704
CooldownMetaId: TUniqueId(hi:-8697097432131255833, lo:9213158865768502666)
您还可以通过在存储策略中指定的路径下查找对象存储端的冷数据。
对象存储中的数据只有一个副本。
5.执行查询
当表LineItem1中的所有数据都移至对象存储并从表LineItem1中查询请求数据时,Apache Doris将遵循相关数据分区的存储策略中指定的root路径,并下载本地计算的请求的数据。
Apache Doris 2.0已针对冷数据查询进行了优化。只有首次访问冷数据才会从对象存储中进行完整的网络I/O操作。之后,下载的数据将被放入缓存中以进行后续查询,以提高查询速度。
6.更新冷数据
在Apache Doris中,每个数据摄入都会导致一个新的rowset生成,因此历史数据的更新将放在与新加载数据的行相分开的行列中。这是如何确保更新冷数据不会干扰热数据的摄入。一旦排行冷却后,它们将移至S3并在本地删除,并且更新的历史数据将转到其属于的分区。
如果您有任何疑问,请在Slack上找到Apache Doris开发人员。我们很乐意提供有针对性的支持。