Apache Doris 基础 -- 数据表设计(分层存储)

2024-06-12 05:28

本文主要是介绍Apache Doris 基础 -- 数据表设计(分层存储),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、应用场景

未来一个重要的用例是类似于ES日志存储,其中日志场景中的数据是根据日期分割的。许多数据都是查询不频繁的冷数据,因此需要降低此类数据的存储成本。考虑到节约成本:

  • 来自不同厂商的常规云磁盘的定价比对象存储更昂贵。
  • Doris 集群实际在线使用时,常规云盘利用率不能达到100%。
  • 云磁盘不按需计费,对象存储按需计费。
  • 使用普通云磁盘实现高可用性需要多个副本和副本迁移,以防止出现故障。相比之下,将数据存储在对象存储中可以消除这些问题,因为它是共享的。

2、解决方案

在分区级别设置冻结时间,表示多久这个 Partition 会被 Freeze,并定义冻结后数据的远程存储位置。在BE(后端)守护线程中,会定期检查表的冻结状态。如果满足冻结条件,则上传数据到兼容S3协议和HDFS的对象存储

冷热分层支持所有Doris功能,并且只将一些数据移动到对象存储中,以节省成本而不牺牲功能。因此,它具有以下特点:

  • 冷数据存储在对象存储上,用户无需担心数据的一致性和安全性。
  • 灵活的冻结策略,其中冷远程存储属性可以应用于表和分区级别。
  • 用户可以查询数据,而不用担心数据的分布。如果数据不是本地的,它将从对象存储中提取,并在BE(后端)本地缓存。
  • 副本克隆优化。如果存储的数据在对象存储上,克隆副本时不需要在本地获取存储的数据。
  • 远程对象空间回收。当表或分区被删除或冷热分级过程中出现特殊情况导致空间浪费时,回收线程会定期回收空间,从而节省存储资源。
  • 缓存优化,在BE中本地缓存访问的冷数据,以实现类似于非冷-热分层的查询性能。
  • BE线程池优化,区分来自本地和对象存储的数据源,以防止读取对象的延迟影响查询性能。

3、存储策略的使用

存储策略是使用冷热分层特性的入口点。用户只需要在表创建期间或使用Doris时将存储策略与表或分区关联起来

在创建S3资源时,将执行远程S3连接验证,以确保资源的正确创建。

下面是创建S3资源的示例:

CREATE RESOURCE "remote_s3"
PROPERTIES
("type" = "s3","s3.endpoint" = "bj.s3.com","s3.region" = "bj","s3.bucket" = "test-bucket","s3.root.path" = "path/to/root","s3.access_key" = "bbb","s3.secret_key" = "aaaa","s3.connection.maximum" = "50","s3.connection.request.timeout" = "3000","s3.connection.timeout" = "1000"
);CREATE STORAGE POLICY test_policy
PROPERTIES("storage_resource" = "remote_s3","cooldown_ttl" = "1d"
);CREATE TABLE IF NOT EXISTS create_table_use_created_policy 
(k1 BIGINT,k2 LARGEINT,v1 VARCHAR(2048)
)
UNIQUE KEY(k1)
DISTRIBUTED BY HASH (k1) BUCKETS 3
PROPERTIES("storage_policy" = "test_policy"
);

下面是一个创建HDFS资源的示例:

CREATE RESOURCE "remote_hdfs" PROPERTIES ("type"="hdfs","fs.defaultFS"="fs_host:default_fs_port","hadoop.username"="hive","hadoop.password"="hive","dfs.nameservices" = "my_ha","dfs.ha.namenodes.my_ha" = "my_namenode1, my_namenode2","dfs.namenode.rpc-address.my_ha.my_namenode1" = "nn1_host:rpc_port","dfs.namenode.rpc-address.my_ha.my_namenode2" = "nn2_host:rpc_port","dfs.client.failover.proxy.provider" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider");CREATE STORAGE POLICY test_policy PROPERTIES ("storage_resource" = "remote_hdfs","cooldown_ttl" = "300"
)CREATE TABLE IF NOT EXISTS create_table_use_created_policy (k1 BIGINT,k2 LARGEINTv1 VARCHAR(2048)
)
UNIQUE KEY(k1)
DISTRIBUTED BY HASH (k1) BUCKETS 3
PROPERTIES("storage_policy" = "test_policy"
);

使用以下命令将存储策略与现有表关联:

ALTER TABLE create_table_not_have_policy SET ("storage_policy" = "test_policy");

使用实例将存储策略与已有分区关联。

ALTER TABLE create_table_partition MODIFY PARTITION (*) SET ("storage_policy" = "test_policy");

如果在表创建过程中为整个表和某些分区指定了不同的存储策略,那么分区的存储策略集将被忽略,表的所有分区将使用表的存储策略。如果希望某个特定分区具有不同于其他分区的存储策略,可以使用上面提到的方法修改该特定分区的关联。
要了解更多细节,请参考Docs目录中的以下文档:RESOURCE, POLICY, CREATE TABLE, ALTER TABLE,其中提供了详细的解释。

3.1 限制

  • 一个表或分区只能与一个存储策略相关联。一旦关联,如果不首先删除它们之间的关联,则不能删除存储策略。
  • 存储策略关联的对象信息不支持修改数据存储路径,如bucketendpointroot_path等信息。
  • 存储策略支持创建、修改和删除。在删除存储策略之前,请确保没有表引用该存储策略。
  • 存储策略支持创建、修改和删除。在删除存储策略之前,请确保没有表引用该存储策略。
  • 当启用Merge-on-Write特性时,Unique模型不支持设置存储策略。

4、已占用的冷数据对象大小

方法1:可以使用show proc '/backends'命令查看每个后端上传对象的大小。查找RemoteUsedCapacity字段。请注意,这种方法可能会有一些延迟。

方法2:可以使用show tablet from tableName命令查看表中每个tablet的大小,由RemoteDataSize字段表示。

5、冷数据缓存

如前所述,对冷数据引入缓存是为了优化查询性能和节省对象存储资源。当冷数据在冷却后首次被访问时,Doris将冷却后的数据重新加载到后端(BE)的本地磁盘上。冷数据缓存具有以下特点:

  • 缓存存储在BE的磁盘上,不占用内存空间。
  • 缓存可以限制大小,并使用LRU (Least Recently Used)进行数据清除。
  • 冷数据缓存的实现与联合查询catalog的缓存相同。请参考Filecache的文档了解更多细节。

6、冷数据的压缩

冷数据进入的时间是从数据行集文件写入本地磁盘的那一刻算起,再加上冷却持续时间。由于数据不是一次性写入和冷却的,因此Doris对冷数据执行压缩,以避免对象存储中的小文件问题。然而,冷数据压缩的频率和资源优先级不是很高。建议在冷却前对本地热数据进行压缩处理。您可以调整以下BE参数:

  • BE参数cold_data_compaction_thread_num设置冷数据压缩的并发性。默认值为2。
  • BE参数cold_data_compaction_interval_sec设置数据冷压缩的时间间隔。缺省值是1800秒(30分钟)。

7、冷数据的模式更改

冷数据支持以下模式更改类型:

  • 添加或删除列
  • 修改列类型
  • 调整列序
  • 添加或修改索引

8、冷数据的垃圾回收

冷数据的垃圾数据是指没有被任何副本使用的数据。以下情况可能会在对象存储上产生垃圾数据:

  • 上传 rowset 失败但是有部分 segment 上传成功。
  • 在FE重新选择CooldownReplica之后,旧的和新的CooldownReplica的行集版本不匹配。FollowerReplicas同步新CooldownReplicaCooldownMeta,旧CooldownReplica中版本不一致的rowset 成为垃圾数据。
  • 在冷数据压缩之后,合并前的行集(rowsets)不能立即删除,因为它们可能仍被其他副本使用。但是,最终,所有FollowerReplicas都使用最新合并的行集,合并之前的行集成为垃圾数据。

此外,对象上的垃圾数据不会立即清理。BE参数remove_unused_remote_files_interval_sec设置冷数据垃圾收集的时间间隔。缺省值是21600秒(6小时)。

这篇关于Apache Doris 基础 -- 数据表设计(分层存储)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1053315

相关文章

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

SpringBoot整合Apache Flink的详细指南

《SpringBoot整合ApacheFlink的详细指南》这篇文章主要为大家详细介绍了SpringBoot整合ApacheFlink的详细过程,涵盖环境准备,依赖配置,代码实现及运行步骤,感兴趣的... 目录1. 背景与目标2. 环境准备2.1 开发工具2.2 技术版本3. 创建 Spring Boot

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Spring Boot 整合 Apache Flink 的详细过程

《SpringBoot整合ApacheFlink的详细过程》ApacheFlink是一个高性能的分布式流处理框架,而SpringBoot提供了快速构建企业级应用的能力,下面给大家介绍Spri... 目录Spring Boot 整合 Apache Flink 教程一、背景与目标二、环境准备三、创建项目 & 添

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事