如何使用Apache Doris分离存储中的冷热数据
#教程 #开源 #云 #database

首先,您需要对象存储桶和相关的访问密钥(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_s3root 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)

您还可以通过在存储策略中指定的路径下查找对象存储端的冷数据。

对象存储中的数据只有一个副本。

1

5.执行查询

当表LineItem1中的所有数据都移至对象存储并从表LineItem1中查询请求数据时,Apache Doris将遵循相关数据分区的存储策略中指定的root路径,并下载本地计算的请求的数据。

Apache Doris 2.0已针对冷数据查询进行了优化。只有首次访问冷数据才会从对象存储中进行完整的网络I/O操作。之后,下载的数据将被放入缓存中以进行后续查询,以提高查询速度。

6.更新冷数据

在Apache Doris中,每个数据摄入都会导致一个新的rowset生成,因此历史数据的更新将放在与新加载数据的行相分开的行列中。这是如何确保更新冷数据不会干扰热数据的摄入。一旦排行冷却后,它们将移至S3并在本地删除,并且更新的历史数据将转到其属于的分区。

如果您有任何疑问,请在Slack上找到Apache Doris开发人员。我们很乐意提供有针对性的支持。